【问题标题】:Run a PowerShell method from cmd and don't wait for its return从 cmd 运行 PowerShell 方法,不要等待它的返回
【发布时间】:2017-01-30 09:28:06
【问题描述】:

在 cmd 中,我尝试运行位于 PowerShell 脚本 script1 中的 Method1Method1 是一个需要几个小时的方法,我简直想开枪就忘了。

以下内容对我有用:

c:\temp> powershell
PS c:\temp> . .\script1.ps1;Method1

当我执行上述几行时,只要我保持 PS 的 CMD 打开,一切都会正常工作。一旦我关闭 PS 窗口,它就会杀死 Method1

所以实际上我希望在一行中通过 cmd 以某种方式使 Method1 在不依赖 PowerShell 窗口的情况下工作,也许创建一个新进程.. 我不太确定。

我试过了:

c:\temp> cmd /c powershell . .\script1.ps1;Method1

它运行了几秒钟,但是当 cmd 关闭时,Method1 也终止了。

我也试过

c:\temp>cmd /c powershell -noexit "& { . .\script.ps1;Method1 }"

再一次,一旦我这样做了,它就可以工作了。但是,会打开一个 PowerShell 窗口,如果我关闭它,它会终止 Method1


在你的帮助下,我试过了:

c:\temp> cmd /c powershell start-process cmd /c powershell . .\script1.ps1;Method1

但我得到一个例外:

Start-Process : 找不到接受的位置参数 参数“powershell”。

但是,我仍然无法让它工作。

【问题讨论】:

    标签: powershell cmd


    【解决方案1】:

    或者,如果您想要一个纯 PowerShell 解决方案(注意这需要以管理员身份运行):

    Invoke-Command LocalHost -Scriptblock $script -InDisconnectedSession
    

    InDisconnectedSession 开关在单独的 PowerShell 会话中运行它,当您关闭 PowerShell 窗口时该会话不会终止。您还可以使用Get-PSSession 并将会话传递给Enter-PSSession,以便在执行期间或之后与之交互。请记住,在这种状态下,如果您关闭窗口,它将 - 杀死它,因此您需要使用 Exit-PSSession 使其保持活动状态。

    但是有一个问题 - 你不能做任何远程任务,至少不容易。这会引起“双跳”的愤怒,在这种情况下,您远程连接到一台计算机(在这种情况下是您自己的),然后再连接到另一台,并且为了安全,PowerShell 拒绝将任何凭据传递给第二个远程会话,因此它无法连接,即使如果您手动输入凭据。如果您确实需要进行远程处理,我建议您坚持启动隐藏的 PowerShell 进程。

    【讨论】:

    【解决方案2】:

    您可以为此使用 PowerShell 作业,因此只需:

    Start-Job -FilePath somepath
    

    并在脚本末尾添加一个方法调用,或者传入一个Scriptblock,如:

    Start-Job -ScriptBlock {. .\path_to_ps1; Method1}
    

    或者也许使用hackish:

    start-process cmd -WindowStyle Hidden -ArgumentList "'/c powershell . .\script1.ps1;Method1'"
    

    实际上,您可以直接启动 PowerShell,而无需 CMD,我不确定我为什么使用 cmd 方法:

    start-process powershell -WindowStyle Hidden -ArgumentList ". .\script1.ps1;Method1"
    

    【讨论】:

    • 我正在查看您的最后一个答案,我正在尝试从 cmd 运行它,那么如何调用启动进程
    • 我不确定你在问什么,只需将其粘贴到 powershell 窗口中?
    • 粘贴到 PS 后出现错误:不允许使用与号。 & 运算符保留供将来使用;使用“&”将 & 号作为字符串传递。
    • Start-Job 将不起作用,当您关闭 PowerShell 窗口时,任何关联的作业和线程都将随之关闭。您需要使用会话或隐藏的新 PS 进程。
    【解决方案3】:

    你会很容易回答;只需将“开始”命令粘贴到您的 PS 窗口中(无论是否在远程会话中),它就可以正常工作:

    Start C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -file 'driverletter:\path\yourpowershellscript.ps1'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2022-12-09
      相关资源
      最近更新 更多