powershell - powershell 调用命令更新具有多行内容的文件的内容
问题描述
我需要在多个服务器上的一堆配置文件中更新服务器名称。我有一个快速脚本来执行此操作,但不想单独登录每个服务器并将脚本移动到本地以运行它。所以我正在使用调用命令。一切都在获取文件的内容并更新它,但是当我尝试将新内容写回文件时,我在 Set-Content 上收到 PositionalParameterNotFound 错误。我假设是因为它是多行的?
这是遍历文件并尝试将它们写回的代码块:
ForEach($file in $Files){
$content = Invoke-command -computerName $computerName -ScriptBlock {get-Content $args[0] -raw} -argumentlist $($file.FullName)
$content = $content -replace $serverRegEx, $newServer
Invoke-command -computerName $computerName -ScriptBlock {Set-Content -path $args[0] -value "$($args[1])"} -argumentList $($file.FullName) $content
}
如何将此多行内容传递回远程命令参数?
解决方案
这是一个范围问题。
如果没有指定,您不能在远程会话中使用局部变量。这需要 PowerShellv3+ 及更高版本。
例子:
Invoke-Command -ComputerName Server01 -ScriptBlock {
Write-Output The value of variable a is: $using:a
Write-Output The value of variable b is: $using:b
}
Get-Help about_remote_variables -Full
详细描述
您可以在远程计算机上运行的命令中使用变量。只需为变量分配一个值,然后使用该变量代替该值。
默认情况下,远程命令中的变量假定在命令运行的会话中定义。您也可以使用在本地会话中定义的变量,但您必须在命令中将它们标识为本地变量。
使用局部变量
您也可以在远程命令中使用本地变量,但您必须指明该变量是在本地会话中定义的。
从 Windows PowerShell 3.0 开始,您可以使用使用范围修饰符来标识远程命令中的局部变量。
推荐阅读
- wordpress - 创建 .htaccess 重定向规则,删除从根目录而不是子目录提供的文件的扩展名?
- javascript - 如何在 React js 中从客户端服务获取 cookie 值到服务器服务?
- angular - 绑定到Angular 12中div的未知属性
- sapui5 - 在生命周期内无法更改应用本地化
- laravel - Laravel 下载图片
- flutter - Flutter Listview builder在热重载之前是空白的
- linux - cloud-init 使用 DHCP 中给定的域作为主机名
- string - 使用 Rust 中的自定义派生宏获取具有任何结构的字段名称的原始 vec
- reactjs - 如何在功能组件上同时使用 withWidth 和 withStyles 作为高阶组件?
- excel - EXCEL INDIRECT 动态地显示工作表和单元格