如何让PowerShell提示脚本文件中的命令?

oxosxuxt  于 2023-05-07  发布在  Shell
关注(0)|答案(2)|浏览(168)

假设我有一个脚本文件,在它的中间(或在结尾或其他地方),我希望用户能够访问当前会话,就像没有运行脚本一样,并开始按他的意愿编写命令。
我知道这是可能的,在脚本的最后,通过运行powershell与-NoExit参数。但是:

  • 必须手动调用powershell/pwsh二进制文件并为每次调用指定参数
  • 你不能在剧本中间

我知道我可以简单地通过执行powershell二进制文件来打开一个新会话,如下所示:

Some-Command
echo "current PID=$PID" # let's say PID is 12345
$var = 123
& pwsh
Another-Command

但我想访问“当前”会话。这意味着$PID在脚本中是12345,当我输入命令时,。这意味着我可以访问所有具有当前值的变量(因此我可以读取$var并获得123),然后随时退出,并继续执行脚本。
我查看了Enter-PSHostProcess,但它无法连接到当前进程,并且(显然)无法访问变量(我认为这是出于安全原因)。
这一切,到底有没有可能?
谢谢
PS:如果不清楚的话,我的意图并不是简单的“在执行后保持脚本打开”,我知道怎么做;它不是“提示用户输入”(意思是数据),我知道怎么做

w7t8yxp5

w7t8yxp51#

目前为止我最好的解决办法是

while($true){Invoke-Expression $(Read-Host $(prompt))}
 # or
while($true){Invoke-Expression $(Read-Host 'Custom Prompt> ')}

这是非常丑陋的:正如@olaf指出的,invoke-expression is to be avoided like hell
(also我担心这可能在某种程度上不能完全发挥作用?例如作用域问题、管道/中断问题等)

6kkfgxo0

6kkfgxo02#

@mclayton在这里建议的完全不同的可能解决方案,使用断点:

function debug_break() {}
Get-PSBreakpoint | Remove-PSBreakpoint
Set-PSBreakpoint -Command debug_break

Write-Output '111'
$xxx = 999
debug_break # here i can see $xxx being 999, then i can type "continue" to go on with the script
Write-Output '222'

相关问题