【发布时间】:2016-02-15 21:04:11
【问题描述】:
使用 PowerShell 4.0。我正在尝试远程运行驻留在远程服务器上的脚本。我需要将一个变量从我的本地脚本传递到远程脚本。我已经浏览了数十篇帖子并尝试了至少 10 种变体,但似乎都没有奏效。我最初的命令是:
Invoke-Command -ComputerName $ServerList -FilePath $piDeployScript -ArgumentList $SDFEnvironment
其中 $piDeployScript 是远程服务器上脚本的完整 UNC 路径,$SDFEnvironment 是传递给我的脚本的简单字符串参数。看起来参数没有传递给脚本。有没有一种简单的方法可以做到这一点?我还有多远?
更新:我不编写远程脚本,它们是由公司的其他团队编写的。我唯一知道的是需要传递哪些字段并且它们都是位置性的。我不知道远程脚本中的实际参数名称。我可以得到它们,但我正在尝试编写一些不管远程脚本上的参数如何都可以工作的东西。我获得了一个参数值列表(在本例中为 1 个参数)并将该字符串列表发送到远程脚本。
更新:根据@dugas,这是我在自己的服务器上运行以测试功能的测试脚本
Param
(
# SDF Environment
[Parameter(Position=0)]
[string]$SDFEnvironment
)
if ($PSBoundParameters.ContainsKey('SDFEnvironment'))
{
"Script Ran Env $SDFEnvironment"|Out-File -FilePath .\$SDFEnvironment"_LogFile.txt" -Encoding ascii -Force
}
else
{
"Environment Parameter missing"|Out-File -FilePath .\"ERR_LogFile.txt" -Encoding ascii -Force
}
更新:下面是运行 Invoke-Command 的本地脚本的整个部分:
# Run the specifed script on all computers
Write-Output ("Running command ""{0}"" on server(s) ""{1}"" for Environment ""{2}"" " -f $piDeployScript,$SDFServerList,$SDFEnvironment)
try
{
if (Test-Connection -ComputerName $SDFServerList -Quiet)
{
Invoke-Command -ComputerName $SDFServerList -FilePath $piDeployScript -ArgumentList $SDFEnvironment
}
else
{
Write-Error "Remoting not enabled on one or more of ""$SDFServerList"" "
exit 1
}
}
catch
{
Write-Error ("Error running script {0} on server(s) {1}. Check log for more detail." -f $piServerScript,$SDFServerList)
exit 1
}
这是该代码的输出:
Running command "D:\AHP\pi_exceed_presentation\pi_exceed_presentation_deploy.ps1" on server(s) "ad1hfdahp802" for Environment "INT"
D:\a5\RWS_pi_exceed_presentation\Content_Deploy\trunk\deploy\Deploy-Content.ps1
: Error running script pi_exceed_presentation_deploy.ps1 on server(s)ad1hfdahp802. Check log for more detail.
我对 $piDeployScript 变量不好。它不是脚本的 UNC,它是远程服务器上的本地文件系统地址。那是问题吗?它是在我的本地 D: 驱动器上寻找脚本吗?我刚刚回答了我的问题吗?
为了测试我上面的问题,我从我的桌面在 PowerShell 中运行了这段代码:
$s="ad1hfdahp802"
$SDFEnvironment="INT"
$fp="\\ad1hfdahp802\D$\AHP\pi_exceed_presentation\pi_exceed_presentation_deploy.ps1"
try
{
Invoke-Command -ComputerName $s -FilePath $fp -ArgumentList $SDFEnvironment
}
catch
{
write-output "error running $fp on $s for $SDFEnvironment"
}
返回的代码没有错误,但远程脚本没有运行。我通过 RDC 登录到远程服务器,并在 PowerShell 中本地运行远程脚本,使用和不使用参数,它按预期工作。现在我真的很难过。
【问题讨论】:
-
我刚刚对此进行了测试,它确实有效。查看 $piDeployScript 并确认定义了一个参数:param($someParameter)。如果可以,请从脚本中发布参数声明。
-
@dugas - 我用我在测试服务器上运行的整个测试脚本更新了我的问题。该脚本仅验证参数是否已传递,并将内容写入日志文件,在 Invoke-Command 完成后检索该文件。
-
@dugas - 请查看最新更新。事实证明,我正在传递一个本地文件系统路径(“D:\....”)而不是像我想的那样传递一个 UNC 的输出。这是否意味着它正在查看我的本地文件系统而不是远程服务器?如果是这样,我可以重写我的脚本以使用 UNC,但这需要一些工作,因为我可能有一个服务器列表,并且每个服务器的 UNC 都不同。我必须遍历我的列表,而不是仅仅将列表传递给 $SDFServerList 中的 Invoke-Command。
-
来自文档:-FilePath string 在一台或多台远程计算机上运行指定的本地脚本。输入脚本的路径和文件名,或通过管道将脚本路径传递给 Invoke-Command。该脚本必须驻留在本地计算机上或本地计算机可以访问的目录中。使用 -ArgumentList 指定脚本中参数的值。使用此参数时,PowerShell会将指定脚本文件的内容转换为脚本块,将脚本块传输到远程计算机,并在远程计算机上运行。
-
我读到了,但我想我看到了一些帖子,其中人们使用带有 UNC 的 -FilePath 到远程服务器上的某个位置。假设 PS 不在乎它是 UNC,那应该没关系。但是,我想确实如此。那么,如何运行远程驻留的脚本?我在这个设计中没有真正的选择。我正在尝试使已经存在的东西自动化并手动运行。我是否将脚本从服务器检索到变量中并将其放入 ScriptBlock 中?如果是这样,我如何仍然使用 ArgumentList 作为参数?鉴于 16 个示例,文档令人困惑......
标签: powershell powershell-remoting powershell-4.0