要在分配动态变量不起作用时调用表达式[重复]

问题描述 投票:1回答:1

此问题已经在这里有了答案:

我的任务是连接到其他VM并执行某些任务,.....并传递任务参数。我为此使用Invoke-Expression,.....现在,当我直接在invoke-expression中传递静态路径时,效果很好,但是当我将其分配给varible并追加到invoke-expression时。它不起作用

我尝试通过提供静态路径来正常工作,并在远程虚拟机上执行批处理,问题是路径是动态的

  Static is working fine has shown below:

  $server="slc10XXX.XX.XXXX.com"
  $username="XXXXXXX"
  $password="XXXXXX@321"
  $pass = ConvertTo-SecureString -AsPlainText $password -Force
  $cred = New-Object System.Management.Automation.PSCredential - 
  ArgumentList $username, $pass
  $path="cmd.exe /c C:\Task6-MASSUOW\chay.bat"
  Invoke-Command -ComputerName $server -credential $cred -ErrorAction Stop 
  -ScriptBlock {Invoke-Expression -Command:"cmd.exe /c C:\Task6- 
  MASSUOW\chay.bat"}

  Getting issue in below code when i assign $path:

  $server="slc10XXX.XX.XXXX.com"
  $username="XXXXXXX"
  $password="XXXXXX@321"
  $pass = ConvertTo-SecureString -AsPlainText $password -Force
  $cred = New-Object System.Management.Automation.PSCredential - 
  ArgumentList $username, $pass
  $path="cmd.exe /c C:\Task6-MASSUOW\chay.bat"
  Invoke-Command -ComputerName $server -credential $cred -ErrorAction Stop 
  -ScriptBlock {Invoke-Expression -Command:"$path"}

PowerShell.exe:无法将参数绑定到参数'Command',因为它为空。在第1行:char:1+ PowerShell.exe -ExecutionPolicy绕过-File'C:\ Users \ chaj \ Documents ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~+ CategoryInfo:未指定:(无法绑定arg ...,因为它为null。:String)[],RemoteException+ FullyQualifiedErrorId:NativeCommandError在C:\ Users \ chaj \ Documents \ String \ Chat1.ps1:8 char:1+调用命令-ComputerName $ server -credential $ cred -ErrorAction S ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~+ CategoryInfo:InvalidData:(:) [Invoke-Expression],ParameterBindingValidationException+ FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand+ PSComputerName:slc10XXXX.XX.XXXX.com

powershell
1个回答
0
投票

这是因为"$path"作为字符串文字发送到了远程服务器。该表达式将在此处求值,但在远程会话中未定义$path。这就是为什么它为空的原因。

例如,您可以这样做:

Invoke-Command -ComputerName $server -Credential $cred -ErrorAction Stop -ScriptBlock {
   param($path)
   Invoke-Expression -Command:$path
} -ArgumentList "cmd.exe /c C:\Task6-MASSUOW\chay.bat"

或更简单:

Invoke-Command -Script { & $Args[0] } -Arg "C:\Task6-MASSUOW\chay.bat" -Computer $server -Cred $cred -EA Stop
© www.soinside.com 2019 - 2024. All rights reserved.