2013-04-03 71 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 
相關問題