从cmd中运行PowerShell方法,不等待其返回

4
在cmd中,我尝试运行位于PowerShell脚本script1中的Method1。Method1是一个需要几个小时的方法,我想只需启动并忘记它。以下内容适用于我:
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' 的位置参数。

但是,我仍然无法使其正常工作。

3个回答

4

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

Invoke-Command LocalHost -Scriptblock $script -InDisconnectedSession
InDisconnectedSession开关会在一个单独的PowerShell会话中运行程序,即使关闭PowerShell窗口也不会终止该会话。您还可以使用Get-PSSession命令并将会话传递给Enter-PSSession命令,在执行期间或之后与其交互。请记住,如果您关闭窗口,该会话将被终止,因此您需要使用Exit-PSSession命令来保持其活动状态。
然而,这里有一个问题——您无法轻松地执行任何远程任务。这会引起“双跳”问题,其中您首先远程连接到一个计算机(在本例中是您自己的计算机),然后再连接到另一个计算机。由于安全原因,PowerShell拒绝向第二个远程会话传递任何凭据,因此它无法连接,即使您手动输入凭据也不行。如果您确实需要进行远程操作,我建议使用隐藏的PowerShell进程启动。

请参阅 *Invoke-Expression 被认为是有害的*。 - Peter Mortensen
4
谁提到了Invoke-Expression? - Deadly-Bagel

3
您可以使用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 中运行它,那么我该如何调用 start-process 呢? - user829174
我不确定你在问什么,只是将这段内容粘贴到PowerShell窗口中吗? - 4c74356b41
一旦我粘贴到PS中,就会出现错误:不允许使用“&”符号。"&"运算符保留供将来使用;请使用"&"将"&"作为字符串传递。 - user829174
当你关闭 PowerShell 窗口时,Start-Job 将无法工作,任何关联的作业和线程将被关闭。你需要使用会话或隐藏新的 PS 进程。 - Deadly-Bagel

1
很简单,只需在您的PowerShell窗口中粘贴“start”命令(无论是在远程会话还是本地),它就可以正常工作:
Start C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -file 'driverletter:\path\yourpowershellscript.ps1'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接