2013-04-03 21 views
1

我想使用PowerShell在配置文件中交替设置。例如,如果某个值为真,我想将其切换为false。如果它是错误的,我想将它切换为true。我也想更改从\\servername\folder\\\servername\的路径。有没有一种方法可以在不使用中间值的情况下在PowerShell中执行此操作?如何在不使用中间值的情况下在PowerShell中交替/切换部分字符串?

如果我这样做:

$foo = 'aaa'

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

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

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

回答

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\" 
+0

看起来可能需要'替换$ e1,$ v2'和' - 替换$ e2,$ v1'?否则会有一些额外的反斜杠。 – 2013-04-23 21:29:54

+0

确实如此。感谢您的高举。现在已经修复了。 – 2013-04-23 21:50:43

0

只需使用-not运算符即可替换布尔值($ true或$ false)例如: -

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

正则表达式替换:

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

比尔

+0

啊,我知道第一个例子会让我陷入困境。我试图改变路径('\\ servername \ folder \'会变成'\\ servername \')。无论如何,我正在使用一个文件,而我正在处理的事实上是一个字符串,而不是一个布尔值。 – 2013-04-03 19:18:53

+0

已更新的答案。 – 2013-04-03 19:25:50

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 
相关问题