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
表達式替換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
電話。
這完美地工作,我看到我要去哪裏錯了,謝謝 – ETHER