Powershell - 如果声明要验证foreach替换脚本

时间:2012-10-11 15:57:53

标签: powershell if-statement for-loop foreach

请注意:我在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

1 个答案:

答案 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”。