首页 > 解决方案 > 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
}

如何将此多行内容传递回远程命令参数?

标签: powershellinvoke-command

解决方案


这是一个范围问题。

如果没有指定,您不能在远程会话中使用局部变量。这需要 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 开始,您可以使用使用范围修饰符来标识远程命令中的局部变量。


推荐阅读