在cmd中,我尝试运行PowerShell脚本Method1
中的script1
。
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'。
但是,我仍然无法使其发挥作用。
答案 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"