【问题标题】:Using Powershell Invoke-Command on remote session to invoke executable by string在远程会话上使用 Powershell Invoke-Command 通过字符串调用可执行文件
【发布时间】:2015-08-07 07:03:52
【问题描述】:

我想编写一个 Powershell 脚本,通过其路径调用远程计算机上的可执行文件,然后等待它完成运行。这是我到目前为止所得到的:

$executable = "C:\Temp\example.exe"
$session = New-PSSession -ComputerName VIRTUALMACHINE
$job = Invoke-Command -Session $session -ScriptBlock {$executable} -AsJob
Wait-Job -Job $job

远程机器不是运行 C:\Temp\example.exe,而是运行字符串 $executable - 不完全是我想要的!

我该如何解决这个问题?

【问题讨论】:

    标签: powershell-3.0 powershell-remoting invoke-command


    【解决方案1】:

    使用来自 Bacon Bits 答案的一些信息、来自this 答案的信息以及来自this 答案的一些信息,我设法拼凑出一个解决方案。

    $executable = "C:\Temp\example.exe"
    $session = New-PSSession -ComputerName VIRTUALMACHINE
    Invoke-Command -Session $session -ScriptBlock {Start-Process $using:executable -Wait}
    

    我之前使用的脚本块会将$executable 作为脚本运行,即在远程会话中返回$executable 的值,这根本不起作用。这不会获得$executable 的本地值,即使它运行了它也不会运行可执行文件。要获取远程会话的本地值,$using:executable 将提供服务,但它仍然没有被执行。现在,使用Start-Process $using:executable 将运行可执行文件,&$using:executableInvoke-Expression $using:executable 也将运行,但它似乎不起作用,因为作业将立即完成。使用Start-Process $using:executable -Wait 将实现最初预期的任务,尽管我认为有很多方法可以做到这一点。

    我会等到其他人有时间提出更好的答案或纠正我可能在这里给出的任何错误信息时才接受这个答案。

    【讨论】:

    • 很好的研究!我完全忘记了变量范围问题。
    【解决方案2】:

    您需要调用运算符 (&) 来执行字符串,就像它是脚本、调用表达式或启动进程一样。试试{&$executable}{iex $executable}{Start-Process $executable}

    Each one functions slightly different,所以你绝对应该测试它们。根据我的经验,你必须摆弄他们才能让他们做你想做的事情并按照你想要的方式行事。

    【讨论】:

    • 这些都不起作用——它总是试图执行我给它的字面意思,而不是像对待变量一样对待 $executable。此外,我可以在没有 & 或 Invoke-Expression 或 Start-Process 的情况下从 Powershell 会话调用可执行文件,这似乎可行。
    • 如果你能让它工作,然后给我看一些实际的代码,我们将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多