1

我正在尝试使用 PowerShell 更改配置文件中的设置。例如,如果某个值为真,我想将其切换为假。如果它是假的,我想将其切换为真。我还想将路径从\\servername\folder\to更改为\\servername\. 有没有一种方法可以在不使用中间值的情况下在 PowerShell 中执行此操作?

如果我这样做:

$foo = 'aaa'

$foo -replace 'aaa', 'bbb' -replace 'bbb', 'aaa'

$foo永远都是'aaa'。我意识到我可以进行间歇性更改('aaa'变成'ccc'然后更改为'bbb'),但这读起来很乱。

如何在不使用中间值的情况下替换值?

4

3 回答 3

1

使用匹配评估器。不确定这是否更好。

Begin{
[regex]$ValueRegex = 'aaa|bbb'

$ValueToggles = @{
                  aaa='bbb'
                  bbb='aaa'
                 }

$toggleValue = {$ValueToggles[$args[0].groups[0].value]}
}

Process{

$foo = 'Value: aaa'

$ValueRegex.replace($foo,$toggleValue)

}

Value: bbb
于 2013-04-03T19:34:28.103 回答
1

我不太确定你想要达到什么目的。您想在没有缓冲区变量的情况下切换两个值吗?或者你想在两个状态之间切换一个值?后者可以这样实现:

function Toggle($s, $v1, $v2) {
  $e1 = [regex]::Escape($v1)
  $e2 = [regex]::Escape($v2)

  $r = $s
  if ($s -match $e1) {
    $r = $s -replace $e1, $v2
  } elseif ($s -match $e2) {
    $r = $s -replace $e2, $v1
  }

  return ($r)
}

$foo = "..."

Toggle $foo "\\servername\folder\" "\\servername\"
于 2013-04-03T19:55:47.710 回答
0

您可以简单地使用-not运算符替换布尔值($true 或 $false);例如:

PS C:\> $value = $true
PS C:\> $value = -not $value
PS C:\> $value
False

正则表达式替换:

PS C:\> '\\servername\folder\' -replace '^(\\\\[^\\]+)\\[^\\]+', '$1'
\\servername\

账单

于 2013-04-03T19:05:03.980 回答