簡體   English   中英

使用 powershell Get-Content 和 Set-Content 編輯文本文件時遇到問題

[英]Trouble editing text files with powershell Get-Content and Set-Content

目標:更新分布在服務器上的許多文件中的一行文本條目摘要:作為數據中心之間應用程序遷移的一部分,最終用戶桌面上的 .rdp 文件需要更新以指向其遠程桌面服務器的新 IP 地址. 所有 .rdp 文件都駐留在 Windows 服務器上的重定向文件夾 SMB 共享中,我具有管理訪問權限。

Powershell 經驗:最少。 仍然試圖圍繞變量、output 和管道的工作方式。

最初試圖制作一行 powershell 代碼來完成此任務,但卡住了,不得不用下面的兩行代碼制作腳本文件。 - 第 1 行:在文件夾結構中搜索所有.rdp 文件,並將帶有文件名的完整路徑存儲在變量中。 由於用戶往往會意外更改文件名,因此將檢查每個文件,從而消除絕對的可預測性。 -第 2 行:我想遍歷所有文件,以僅用新地址替換兩個特定 IP 地址的實例。 然后將更改寫入原始文件。

$Path = ls 'C:\Scripts\Replace-RDP\TESTFILES\' -Include *.rdp -Recurse -Force -ErrorAction SilentlyContinue | foreach fullname
$Path | (Get-Content -Path $Path) -Replace 'IPserver1','newIPserver1' -Replace 'IPserver2','newIPserver2' | Set-Content $Path -Force

找到了 Powershell 的大部分解決方案,但結果有問題。 第二行代碼當output到屏幕改變memory內容正確。 然而,寫入文件的內容導致新服務器 IP 地址被寫入所有 rdp 文件,即使源 rdp 文件的目標 IP 地址與 -Replace 標准不匹配。

相關行的 a.rdp 內的文本是:
完整地址:s:192.168.1.123 更改為:完整地址:s:172.16.1.23

感謝您在到達終點時提供的所有幫助。 花了幾個小時從各種網站和代碼片段中學習。

您需要跟蹤您正在閱讀的每個文件,以便您可以保存對該文件的更改。 Foreach-Object使這個過程變得簡單。 Foreach-Object腳本塊中,當前 object $_是每個文件的FullName值。

$CurrentIP1 = '192\.168\.1\.123'
$CurrentIP2 = '192\.168\.1\.124'
$NewIP1 = '172.16.1.23'
$NewIP2 = '172.16.1.24'

$files = (Get-ChildItem 'C:\Scripts\Replace-RDP\TESTFILES\' -Filter *.rdp -Recurse -Force -File -ErrorAction SilentlyContinue).FullName
$files | Foreach-Object {
    if (($contents = Get-Content $_) -match "$CurrentIP1|$CurrentIP2") {
        $contents -replace $CurrentIP1,$NewIP1 -replace $CurrentIP2,$NewIP2 |
            Set-Content $_
    }
}

請注意,使用Get-ChildItem上的-File開關(別名ls )僅輸出文件。 由於-replace使用正則表達式進行匹配,因此您必須使用反斜杠轉義文字. 人物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM