阻止Powershell退出

40

我知道PowerShell有一个名为-noexit的小开关。

是否有不使用该开关而保持在shell中的方法?

换句话说,我想要一个执行命令后保持shell打开的脚本命令。


更具体地说:用户右键单击脚本,从上下文菜单中选择“在PowerShell中运行”,脚本将执行并保持shell开启状态。 - rhavin
你需要更改上下文菜单启动器,添加“-noexit”。 - CB.
Cristian,显然这不是脚本内部的内容。 - rhavin
10个回答

38

您基本上有3个选项来防止PowerShell控制台窗口关闭,我在我的博客文章中详细描述。

  1. 一次性解决方案:从PowerShell控制台运行脚本,或使用-NoExit开关启动PowerShell进程。例如: PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
  2. 每个脚本的解决方案:在脚本文件末尾添加一个提示输入的命令,例如:Read-Host -Prompt "按Enter键退出"
  3. 全局解决方案:更改您的注册表键,以始终在脚本运行结束后保持PowerShell控制台窗口打开。

请查看我的博客以获取有关要修改哪些注册表键的更多信息。

听起来您正在寻找选项#1或#3。


24

如果您没有输入参数就运行这个脚本(比如双击它),它将不会退出:

param($Work)

# restart PowerShell with -noexit, the same script, and 1
if (!$Work) {
    powershell -noexit -file $MyInvocation.MyCommand.Path 1
    return
}

# now the script does something
# this script just outputs this:
'I am not exiting'

我考虑发布这个黑客技巧。与UAC提升黑客技巧相同的技术。不太美观,但它有效。 - Andy Arismendi

15

你尝试过吗

$host.enternestedprompt()

这会停止脚本的执行并将用户带到嵌套提示符。当他们退出该提示符后,脚本才会完成并关闭窗口。


2
我刚注意到这个问题也被标记为powershell-remoting。如果相关脚本正在远程系统上作业,那个hack将不起作用。 - mjolinor

12
"do stuff"
Pause
是的,就像命令行--输出一样:
do stuff
Press Enter to continue...:

用户之后应该如何使用PowerShell窗口输入命令? - rhavin

4

如果没有使用-noexit命令调用,我不知道在脚本中可以运行哪个命令可以防止shell退出。

通常,如果我不希望shell关闭,我会在结尾处使用Read-Host "Press ENTER to continue"。但是,如果没有使用-noexit启动shell,则此方法无法防止shell在按下enter键后关闭。


很遗憾,那不是我需要的。 - rhavin
noexit 改变了 PowerShell.exe 的初始化方式,就像 cmd.exe /k 一样。一旦它被初始化成某种方式,我认为它就无法改变了。 - Andy Arismendi

3

这个简单的脚本末尾的while循环会提示我输入一个命令并执行它。它在脚本的环境中运行,因此可以检查变量的值。当输入“exit”时,循环会被终止。

# Do something.

cd D:\temp
$current_directory = $(pwd)
dir

write-host  # Just add a little space after the dir

# Stay in the shell and execute commands.

while ($TRUE) {
  $cmd = Read-Host "PS $(pwd)"
  if ($cmd[0] -eq '"') { iex "& $cmd" } 
    else { iex $cmd }
}

我相信其他人也能分享一些改进意见,但这只是一个开始。敬礼。


2
像这样吗?
PowerShell -File  c:\myscript.ps1 -NoExit

1
不,如果我点击包含你的代码行的文件,它仍然会退出 PowerShell。我需要一种从脚本内部停止当前会话退出的方法。 - rhavin

1

另一种方法是使用$null = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

结合其他答案,有几个选项:

    1. 从命令提示符中运行:PowerShell -NoExit "Path\to\Script\script.ps1"
    1. 在脚本末尾添加:pause
    1. 在脚本末尾添加:read-Host -Prompt "Press Enter to exit"
    1. 在脚本末尾添加:$host.enternestedprompt()
    1. 在脚本末尾添加:$null = host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

-1
Powershell -noexit -command {
$a=1
Echo $a
} # End block
# Script ends but PowerShell windows remains.

2
这正是发帖人所不想要的。[微笑] - Lee_Dailey
我不完全确定这是否正是OP想要的。他知道-noexit,但他是否知道可以像这样使用它,以字面意义上拥有“执行脚本命令后保持shell打开”的脚本命令吗?他所需要做的就是将其附加到任何脚本中,除非他真的由于某些原因无法以特定方式使用它。 - Eric

-7
不是为了挖掘一个六年前的帖子,但对于任何阅读此帖子的人来说应该注意,你可以在你的脚本末尾使用


Stop-Process -processname regedit

如果您启用了注册表调整(全局修复),并且确实想运行一个自动关闭的脚本。

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