切换文件中的字符串

Switch strings in a file

我有一个字符串需要在文件中的两个值之间进行更改。我想做的是,如果我找到值 A 然后更改为值 B,如果我找到值 B 然后更改为值 A。将弹出一个消息框说值已更改为 [xxxxx] 然后背景图片将是也相应地改变了。

$path = c:\work\test.xml
$A = AAAAA
$B = BBBBB
$settings = get-content $path
$settings | % { $_.replace($A, $B) } | set-content $path

我不知道如何使用 IF A 然后用 B 替换或 IF B 然后替换 A。另外,上面的代码将删除文件中的其余内容并只保存我修改回文件的部分。

这没有经过广泛测试,但我认为它应该有效:

path = c:\work\test.xml
$A = 'AAAAA'
$B = 'BBBBB'

[regex]$regex = "$A|$B"

$text = 
Get-Content $path | 
foreach {
$regex.Replace($text,{if ($args[0].value -eq $A){$B} else {$A}})
}

$text | Set-Content $path

如果不确切知道数据是什么样子,很难确定。

假设 $A$B 只包含简单的字符串而不是正则表达式,您可以使用带有通配符匹配的 switch 语句:

$path = 'c:\work\test.xml'
$A = 'AAAAA'
$B = 'BBBBB'

(Get-Content $path) | % {
  switch -wildcard ($_) {
    "*$A*"  { $_ -replace [regex]::Escape($A), $B }
    "*$B*"  { $_ -replace [regex]::Escape($B), $A }
    default { $_ }
  }
} | Set-Content $path

[regex]::Escape() 确保在正则表达式中具有特殊含义的字符被转义,因此值被替换为文字字符串。

如果您的目标是更高级的东西,您可以使用带有回调函数的正则表达式替换:

$path = 'c:\work\test.xml'
$A = 'AAAAA'
$B = 'BBBBB'

$rep = @{
  $A = $B
  $B = $A
}

$callback = { $rep[$args[0].Groups[1].Value] }

$re = [regex]("({0}|{1})" -f [regex]::Escape($A), [regex]::Escape($B))

(Get-Content $path) | % {
  $re.Replace($_, $callback)
} | Set-Content $path