Function Powershell:从函数调用交互式程序会隐藏程序的输出。如何解决这个问题?

Function Powershell:从函数调用交互式程序会隐藏程序的输出。如何解决这个问题?,function,powershell,Function,Powershell,我的职能: Function promptYesNo($prompt) { & dialog --yesno $prompt 0 0 return 1-$LastExitCode } dialog是一个程序,在我的例子中取自cygwin,它创建文本UI对话框(如) 如果我这样调用这个函数: promptYesNo "Prompt" $var = promptYesNo "Prompt" 一切都如我所料。但如果我试图将函数的结果保存到如下变量中: promptYesNo "P

我的职能:

Function promptYesNo($prompt) {
  & dialog --yesno $prompt 0 0
  return 1-$LastExitCode
}
dialog是一个程序,在我的例子中取自cygwin,它创建文本UI对话框(如)

如果我这样调用这个函数:

promptYesNo "Prompt"
$var = promptYesNo "Prompt"
一切都如我所料。但如果我试图将函数的结果保存到如下变量中:

promptYesNo "Prompt"
$var = promptYesNo "Prompt"
我没有从对话框中获得任何可见的输出。我的意思是,对话框正在运行,它会对我所做的事情做出反应,但我看不到它(我猜,输出被重定向到了某个地方)


我做错了什么以及如何纠正?

输出被重定向并存储在变量中

尝试查看T形对象。这应该允许您捕获变量的输出,但仍然可以看到对话框


我怀疑变量包含的内容会超出您的预期,因此您可能需要进行一些筛选。

最简单的解决方案是不重定向函数的输出,而是以其他方式返回结果。以下是一种可行的方法:

Function promptYesNo($prompt, [string]$varname) {
  & dialog --yesno $prompt 0 0
  Set-Variable -Name "script:$varname" -Value (1-$LastExitCode)
}

promptYesNo "Some prompt" -varname "result"
echo $result
设置变量时的
脚本:
作用域将变量设置在调用方的作用域而不是函数作用域中


当然,如果您这样做,您必须确保调用promptYesNo的任何脚本或函数也不会将其输出重定向到最终调用代码的任何脚本或函数。

我根本不需要捕获对话框的stdout。我唯一需要的是退出代码,我使用$LastExitCode提取它。函数中生成的所有输出都通过管道发送。尝试将函数的输出管道化到out-host。这不起作用:它在dialog完成工作后打印整个输出。这是一个很好的简单解决方案。仅供参考,Set变量有一个作用域参数,例如
Set Variable-scope Script-Name$varname-Value(1-$LastExitCode)
。虽然字符长度稍长,但由于可以使用制表符补全,所以键入的字符较少。我只是爱我一些标签完成:-)@KeithHill,谢谢,带
-scope
选项的编号范围可能是更好的选择。