2017-04-25 67 views
2

試圖修改這一行的文件(「VoIP.Enabled‘1’)。我想改變1至零。當我與更換字符串而無需替換文件的PowerShell的全部內容

$dewprefs = Get-Content .\dewrito_prefs.cfg 

$dewprefs | Select-String "VoIP.Enabled" | ForEach-Object {$_ -replace "1","0"} | Set-Content .\dewrito_prefs.cfg}` 
改變

然而,當我使用這個腳本,它會刪除其它100行,編輯行權,然後刪除一切,只留下我想編輯該行。

在這個問題上的任何幫助將高度讚賞

回答

2

Select-String充當過濾器:也就是說,只有的模式匹配時,纔會傳遞給它的輸入。

因此,只有感興趣的行被寫入輸出文件。

不要使用Select-String如果全部輸入行 - 儘管可能被修改 - 應該通過;使用只有ForEach-Object,並有條件修改每個輸入行:

$dewprefs = Get-Content .\dewrito_prefs.cfg 

$dewprefs | 
    ForEach-Object { if ($_ -match 'VoIP\.Enabled') { $_ -replace '1', '0' } else { $_ } } | 
    Set-Content .\dewrito_prefs.cfg 

$_ -match 'VoIP\.Enabled'現在做什麼Select-String沒有在原來的命令:它匹配只有當手頭的輸入行包含文字VoIP.Enabled(注意如何.被轉義爲\.以確保在正則表達式的上下文中被視爲文字)。

if語句的兩個分支如何產生輸出

  • $_ -replace '1', '0'輸出具有0

  • $_替換的1所有實例在輸入行簡單地將輸入的結果按原樣通過。


最有可能的,你可以用一個單一的-replace表達式替換if聲明,然而,假設該文件是足夠小,可以理解爲一個整體(很可能在的情況下配置文件),您可以使用Stu's helpful simplification的變體。

以充分利用該-replace支持正則表達式(正則表達式)的事實,該代碼可以更新,如只VoIP.Enabled基礎上的按鍵名稱線,而無需知道,關鍵的當前值。

$key = 'VoIP.Enabled' 
$newValue = '1' 

# Construct a regex that matches the entire target line. 
$regex = '^\s*' + [regex]::Escape($key) + '\b.*$' 
# Build the replacement line. 
$modifiedLine = "$key $newValue" 

(Get-Content .\dewrito_prefs.cfg) -replace $regex, $modifiedLine | Set-Content .\dewrito_prefs.cfg 

注意,寫輸出回輸入文件只能因爲輸入文件被讀入內存作爲一個整體,前面,由於封閉在(...)Get-Content電話。

+0

這完美地工作,我看到我要去哪裏錯了,謝謝 – ETHER

2

這也可以工作,使用PowerShell v3的+,並且是多了幾分簡潔:(?3個總共引號)

(Get-Content .\dewrito_prefs.cfg).replace('"VoIP.Enabled "1"', '"VoIP.Enabled "0"') | 
    Set-Content .\dewrito_prefs.cfg 

你的報價是有點怪怪的,我模仿你已經什麼然而問道。

+0

這似乎更有點什麼進出口尋找,報價保持服務器配置的值。你能幫我擴展你在這裏寫的東西嗎?如果我想抓住曾經數據是什麼引號之間並對其進行編輯,但不知道是什麼東西,我會一個*在這個數據,例如點。 'Server.Name 「隨機服務器名稱」 $名稱=讀主機-prompt '輸入服務器Name'' '(獲取內容。\ dewrito_prefs.cfg).replace(' 「Server.Name」 * 「','」Server.Name「$ name」')|設置內容\ dewrito_prefs.cfg' – ETHER

+0

++一個簡單的方法。 @ETHER:對於一般的更換是沒有做依靠知道當前值,您必須使用'-replace' _operator_,它採用_regular expressions_而不是'.Replace()'_method_,這對_literals_工程 - 我已經更新了我答案來演示。 – mklement0