PowerShell通过Invoke-Command将本地参数传递给远程脚本

时间:2016-01-28 14:41:52

标签: powershell powershell-remoting powershell-v4.0

使用PowerShell 4.0。我试图远程运行驻留在远程服务器上的脚本。我需要将一个变量从我的本地脚本传递给远程脚本。我已经浏览了几十个帖子,尝试了至少10个变种,但似乎都没有。我最初的命令是:

Invoke-Command -ComputerName $ServerList -FilePath $piDeployScript -ArgumentList $SDFEnvironment

其中$ piDeployScript是远程服务器上脚本的完整UNC路径,$ SDFEnvironment是传递给我脚本的简单字符串参数。看起来参数没有传递给脚本。有一个简单的方法吗?我有多远?

更新:我没有编写远程脚本,它们是由公司中的其他组写的。我唯一知道的是需要传递的字段,它们都是位置。我不知道远程脚本中的实际参数名称。我可以得到它们,但我试图编写一些无论远程脚本上的参数如何都能工作的东西。我传递了一个参数值列表(在本例中为1参数),并将该字符串列表发送到远程脚本。

更新:Per @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中使用和不使用参数在本地运行远程脚本,并且它按预期工作。现在我真的很难过。

1 个答案:

答案 0 :(得分:0)

本地脚本:

$server='ad1hfdahp802'
$remotepath='\\ad1hfdahp802\d$\AHP\pi_exceed_presentation\pi_exceed_presentation_deploy.ps1'
$scriptPath='d:\AHP\pi_exceed_presentation\'
$SDFEnvironment='INT'
Invoke-Command -ComputerName $server -FilePath $remotepath -ArgumentList($SDFEnvironment,$scriptPath)

远程脚本:

Param
(
# SDF Environment
[Parameter(Position=0)]
[string]$SDFEnvironment,

[Parameter(Position=1)]
[string]$scriptPath
)
Write-Output "Running Script - $SDFEnvironment"
Write-Output "Path: $scriptPath"
$outpath=("{0}\{1}_LogFile.txt" -f $scriptPath,$SDFEnvironment)
"Script Ran Env $SDFEnvironment"|Out-File -FilePath $outpath -Encoding ascii -Force
Write-Output "Script Complete"

这种组合有效。最初远程脚本使用$ PSCommandPath(也尝试过$ PSScriptRoot)来确定输出路径,但这对远程运行的脚本不起作用。如果您想要确定性地放置输出文件,则必须传入实际路径。