繁体   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