当参数传递而不是文本时,Invoke-Command可执行文件不起作用

时间:2015-12-01 18:15:43

标签: powershell powershell-remoting invoke-command

我构建一个参数化脚本来传递服务器名称和字符串参数以传递给该服务器上的可执行文件。脚本如下所述:

#Set up server and AC parameters
param(
  [string]$DBServer = "stvsqld08",
  [string]$ACString = "Our Personnel"
)

#Set up new session object for accessing production
$sess = New-PSSession -Computer $DBserver

#Execute AC ----DOES NOT WORK
Invoke-Command -Session $sess -ScriptBlock {
  param($scriptACString)
  & 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' $scriptACString
} -Args $ACString 

#---------DOES WORK
Invoke-Command -Session $sess -ScriptBlock {
  param($scriptACString)
  & 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' Our Personnel
} 

你会在" DOES WORK"命令我硬编码发送到可执行文件的文本参数。在"不工作"我试图将此值作为字符串参数传递,但它不起作用。

更新 如果我们将远程执行从图片中取出并在控制台上执行它仍然无法正常工作。据我所知,两个调用操作符的执行应该是相同的。硬编码的成功使用参数调用可执行文件。参数化的一个无法使用参数成功调用可执行文件。

PS C:\Users\mp071663_e> $ACString = "Our Personnel"
PS C:\Users\mp071663_e> write-host $ACString
Our Personnel
PS C:\Users\mp071663_e> & 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' Our Personnel
PS C:\Users\mp071663_e> & 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' $ACString

1 个答案:

答案 0 :(得分:0)

感谢@PetSerAl,这个问题缩小到了一个问题,即powershell在传递参数时将引号括在一个参数中。通常,这不是可执行文件的问题。不幸的是,这个可执行文件拒绝带引号的参数。因此,为了能够传递其中包含空格的单个参数,我设置了10个可以使用的参数,然后在invoke-command中传递时按顺序放置。请参阅下面的最终脚本。任何进一步的建议都非常感谢。

#Set up server and AC parameters
param([string]$DBServer, [string]$ACString1, [string]$AcString2, [string]$ACString3, [string]$ACString4, [string]$ACString5, [string]$ACString6, [string]$ACString7, [string]$ACString8, [string]$ACString9, [string]$ACString10)



#clean out any derelict sessions
try
{
Remove-PSSession $DBServer
}
catch
{
write-host $DBServer had no open sessions
}


#Set up new session object for accessing production
$sess = new-pssession -computer $DBserver

#Execute AC
#invoke-command -session $sess -ScriptBlock {param($scriptACString)& 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' Our Personnel/Personnel Bus Addr}  -args $ACString 
invoke-command -session $sess -ScriptBlock {param($a, $b, $c, $d, $e, $f, $g, $h, $i, $j)& 'C:\Program Files (x86)\LexisNexis\InterAction\IAAppCol\INTIATBC.EXE' $a, $b, $c, $d, $e, $f, $g, $h, $i, $j} -ArgumentList($ACString1, $AcString2, $AcString3, $AcString4, $AcString5, $AcString6, $AcString7, $AcString8, $AcString9, $AcString10)