从cmd运行PowerShell方法,不要等待它返回

时间:2017-01-30 09:28:06

标签: powershell cmd

在cmd中,我尝试运行PowerShell脚本Method1中的script1Method1是一种花费几个小时的方法,我只是想解雇并忘记。

以下内容对我有用:

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'。

但是,我仍然无法使其发挥作用。

2 个答案:

答案 0 :(得分:2)

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

Invoke-Command LocalHost -Scriptblock $script -InDisconnectedSession

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

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

答案 1 :(得分:1)

您可以使用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'"

实际上,您可以在没有CMD的情况下启动PowerShell,我不确定为什么使用cmd方法:

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