以下是一种删除我认为可行的行的方法
# earlier in the script
$inFile = Get-Content -Path ".\input.txt"
# ...Later... #
$inFile = Get-Content -path ".\input.txt" | where-object {$_ -notmatch $line}
set-content -path ".\input.txt" -Value $inFile
问题是-NotMatch参数似乎不起作用。Get-Content cmdlet只复制input.txt中的所有内容,包括$line。我还尝试更改代码以完全清除$inFile并创建一个临时持有者,但没有结果。
Clear-Variable -name "inFile"
$holder = Get-Content -path ".\input.txt" | where-object {$_ -notmatch $line}
set-content -path ".\input.txt" -Value $holder
$inFile = Get-Content -path ".\input.txt"
我是不是用错了-Not Match?以下是上下文的全文脚本。
Write-Host "Starting"
[bool] $keepRunning = 1
[bool] $everFound = 0
[bool] $searchComplete = 0
:main while($keepRunning)
{
$inFile = Get-Content -path ".\input.txt"
$completed = Get-Content -Path ".\output.txt"
$line = $inFile[0]
$holder
if($inFile.count -eq 1)
{
$line = $inFile
}
# create condition to check if $line matches any line in completed.txt
# if it does, skip this line and move on to the next line
:search while($everFound -eq 0 -and $searchComplete -eq 0)
{
#Write-Host "Outer loop"
foreach($url in $completed)
{
#Write-Host $line
#write-host $url
if ($line -eq $url)
{
Write-Host "`nThis file was already downloaded --Skipping to the next line"
$inFile = Get-Content -path ".\input.txt" | where-object {$_ -notmatch $line}
set-content -path ".\input.txt" -Value $inFile
$inFile = Get-Content -path ".\input.txt"
$line = $inFile[0]
$everFound = 1
break
}
}
if ($everFound -eq 1)
{
break
}
$searchComplete = 1
Write-Host "Search Complete`n"
}
Write-Host "Before the download--------"
Write-Host $everFound
Write-Host $searchComplete
if ($everFound -eq 0 -and $searchComplete -eq 1)
{
#download the files
$downloadCommand = "youtube-dl.exe --verbose --cookies .\cookies.txt `"$line`""
get-date
invoke-Expression $downloadCommand
#delete the url
add-content -Path ".\output.txt" -Value $line
$inFile = Get-Content -path ".\input.txt" | where-object {$_ -notmatch $line}
set-content -path ".\input.txt" -Value $inFile
write-host "`n"
get-date
Write-Host "Sleeping for 45mins"
#start-sleep -s 2700
}
$everFound = 0
$searchComplete = 0
Write-Host "-------------After the download!!"
Write-Host $everFound
Write-Host $searchComplete
# check if the file is empty. If it is, set the keepRunning flag to false and exit the main while loop
if($Null -eq $inFile)
{
$keepRunning = 0
}
}
Write-Host "Done"
Read-Host "Press the Enter Key to Exit"
编辑:$inFile在每一行都包含一个YouTube URL列表。$line被赋予$inFile第1行的值
$line = $inFile[0]
以下是YouTube的URL:https://www.youtube.com/watch?v=sB5zlHMsM7k
我还在文件前面添加了一些语句来输出$line的值。谁给我指个方向好吗?
1条答案
按热度按时间jslywgbw1#
我是否错误地使用了
-notmatch
?如果
$line
在输入文件的行中包含要搜索的字面意思(按原样、逐字)搜索的子字符串,并且该子字符串恰好包含regex元字符,例如.
和$
,则说明您错误地使用了它。要使用
-match
/-notmatch
进行文字子字符串匹配,您必须对子字符串进行*转义:如果只想完全匹配行,则必须锚定正则表达式:
请注意,PowerShell没有用于文字子字符串匹配的运算符。
然而,
System.String
([string]
)类型有一个用于字面子字符串匹配的.Contains()
方法,但与PowerShell的运算符不同,它在默认情况下区分大小写(存在不区分大小写的匹配重载,但仅在PowerShell(Core)7+中):对于整行匹配:
或者:
使用
.Contains()
的优势是它比-match
执行得更好,尽管后者提供了更多的灵活性。