目标:更新服务器上分布的许多文件中一行的文本输入摘要:作为数据中心之间应用程序迁移的一部分,最终用户桌面上的.rdp文件需要更新以指向其远程桌面服务器的新IP地址。所有.rdp文件都位于Windows服务器上SMB共享的重定向文件夹中,该文件夹具有我的管理访问权限。
Powershell经验:最少。仍然试图绕过变量,输出和管道工作的方式。
最初是试图制作一行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找到了大多数解决方案,但结果有问题。输出到屏幕上的第二行代码会正确更改内存中的内容。但是,写入文件的内容会导致将新服务器IP地址写入所有rdp文件,即使源rdp文件的目标IP地址与-Replace条件不匹配也是如此。
.rdp中相关行上的文本是:
完整地址:s:192.168.1.123更改为:完整地址:s:172.16.1.23
感谢您在到达终点方面的所有帮助。花了数小时从各种站点和代码段中学习。
您需要跟踪正在读取的每个文件,以便可以将更改保存到该文件。Foreach-Object
使此过程变得容易。在Foreach-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 $_
}
}
请注意,使用-File
开Get-ChildItem
(别名ls
)仅输出文件。由于-replace
使用正则表达式进行匹配,因此必须反斜杠转义文字.
字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句