通过ps远程会话复制文件时调用命令失败

时间:2018-08-07 17:40:44

标签: powershell invoke-command

我有一个关于如何使用Powershell正确构建命令的问题。

这是我遇到问题的代码。

$python_command =
{
    param($script)
    C:\Python27\python.exe $script
    return $lastexitcode
}

$exit_code = Invoke-Command Copy-Item -Path C:\TestWare\jsonStuff.json -Destination 
C:\Tunnel\Tunneling\jsonStuff.json -ToSession $Session - ScriptBlock $python_command -ArgumentList $exec_script

#Clean up
ExitWithCode($exit_code)

我假设$exit_code的格式存在问题,因为当它具有此值时

Copy-Item -Path C:\TestWare\jsonStuff.json -Destination C:\Tunnel\Tunneling\jsonStuff.json -ToSession $Session

没有问题。我希望python命令也能运行。这些命令可以分开吗,或者它们如何一起工作?目前,我收到以下错误

Invoke-Command : A parameter cannot be found that matches parameter name 'Path'.
At C:\TestWare\run-test3.ps1:122 char:39
+ $exit_code = Invoke-Command Copy-Item -Path C:\TestWare\ ...
+                                       ~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeCommandCommand

关于如何解决的任何想法?我也使用Powershell版本5。

(编辑)这是我的ExitWithCode函数

function ExitWithCode
{
    param
    (
        $exitcode
    )
    $host.SetShouldExit($exitcode)
    exit
}

1 个答案:

答案 0 :(得分:0)

Invoke-Command有许多不同的参数集,但是只有两种基本方法可以指定要[远程]调用的命令:

  • 通过-FilePath参数,该参数需要 local 脚本的路径,该脚本的 content 会转换为脚本块,然后在目标机器。

  • 通过-ScriptBlock参数,该参数接受脚本块({ ... }

因此,您尝试通过脚本块直接进行Copy-Item调用的尝试无效。

您似乎需要 2 条语句:

  • 通过Copy-Item调用将某些内容复制到与$Session的会话-ToSession中。

  • 用于在会话Invoke-Command中执行脚本块$python_command的{​​{1}}语句。

如果您将-Session $Session content 读入内存并将其作为 argument 传递,则只能通过一个Invoke-Command调用才能摆脱困境到脚本块并相应地对该参数执行操作。