请注意:我在powershell上非常新,但我写了几个简单的脚本来产生我需要的结果;然而,这个我似乎无法解开(或谷歌)!
我正在尝试编写一个脚本,该脚本将遍历HTML文件的内容并用新的文本字符串替换特定的文本字符串。但是,如果找到的字符串与不应替换的特定字符串类型匹配,则不会被替换。
让我给你整个设置:
$filePath = "C:\test.htm"
$fileContents = Get-Content $filePath
#Get the variable list values
$varList = Get-Content "C:\list_of_variables_to_be_searched.txt"
#The C:\list_of_variables_to_be_searched.txt" file contains the variable name, then a
period, then the replace value. For example, slct.<html information to replace
where "slct" is found>.
#Assign each element split by the period into a single array
$arrayMix = @()
foreach ($var in $varList)
{
$z = $var.split(".")
$arrayMix += $z
}
#Split the arrayMix into two other arrays (varName and varValue)
$varName = @()
$varValue = @()
for ($i = 0; $i -le $arrayMix.Length-1; $i++)
{
if ($i % 2 -eq 0) # Finds even numbers
{
$arrayMix[$i].Trim()
$varName += $arrayMix[$i]
}
else
{
$arrayMix[$i].Trim()
$varValue += $arrayMix[$i]
}
}
现在我要做的是搜索$ fileContents的每一行,搜索数组中的每个varName并将其替换为varValue。
我使用以下代码进行此操作:
for ($i = 0; $i -le $varName.Length-1; $i++)
{
foreach ($line in $filePath)
{
(Get-Content $filePath) |
ForEach-Object { $_ -creplace $varName[$i],$varValue[$i]} |
Set-Content $filePath
}
}
但是,有些情况下varName可能在其前面带有下划线字符(例如,_slct)。使用上面的脚本替换它们,这会导致问题。
我搜索并搜索了在foreach循环中使用if / else的方法,但这些示例对解决此问题没有帮助。
我先试了这个:
foreach ($line in $fileContents)
{
if ($line.Contains("slct_"))
{
continue
}
else
{
$line = {$_ -creplace $varName[1],$varValue[1]}
}
}
但是,我确信那些对Powershell更有经验的人知道,这不起作用。
我接下来决定尝试将所有内容分解为数组,然后像这样循环遍历:
for ($i = 0; $i -le $fileContents.Length-1; $i++)
{
if ($fileContents[$i].Contains("_{0}" -f $varName[$i]))
{
continue
}
else
{
$fileContents[$i] = $fileContents[$i] -creplace $varName[$a],$varValue[$a]
}
}
Set-Content $filePath $fileContents
但是,再说一遍,这也不起作用。有人可以指点我正确的方向吗?有没有办法在foreach循环中使用if / else?或者有没有更好的方法来做到这一点,我还没有学到呢?
谢谢!
更新
我已经让它在测试中工作了,但我无法在foreach循环中运行,或者当变量实际调用数组的特定索引时。
$string = "this is _test to see if test works"
$var1 = "test"
$var2 = "WIN"
$test = [regex]::replace($string, '(?<!_)'+$var1, $var2)
Write-Host $test
尝试此操作时,根据以前的帖子,它没有任何内容:
$string = "this is _test to see if test works"
$var1 = "test"
$var2 = "WIN"
$test = $string -creplace "(?<!_)" $var1,$var2
Write-Host $text
答案 0 :(得分:0)
-creplace会进行正则表达式匹配,对于正则表达式,您可以说'只有在没有使用某些内容时才匹配此',使用负面外观。例如这个正则表达式:
(?<!_)Test
表示“只有在没有_的情况下才匹配测试”。因此,请尝试将-creplace子句更改为:
-creplace "(?<!_)" + $varName[$i], $varValue[$i]
仅当varName不在下划线之前才匹配。
http://www.regular-expressions.info/是了解有关正则表达式的更多信息的好网站,包括背后的负面看法。
至于在foreach中执行if / else,你可以在脚本块中放入一个if / else语句,例如:
$input | ForEach-Object { if ($_ -eq "Test") { "X" } else { "Y" } }
如果输入行为“Test”,则输出“X”,否则输出“Y”。