powershell 如何让Read-Host在包含脚本的变量被赋值时显示提示问题?

hgqdbh6s  于 2023-05-17  发布在  Shell
关注(0)|答案(1)|浏览(270)

我有一个脚本来调用API端点,以便从应用程序的层次结构中检索数据。
此层次结构有几个级别:校园,建筑,楼层为了使它对用户友好,我编写了一个脚本来编译一个表,该表将被查询的层次结构级别的名称放入一个数组中,并将一个数字添加到一个新数组列(基本上是数组索引,使其可读)中的条目中
脚本使用Format-Table命令将表写入终端,然后使用Read-Host命令要求用户根据提供的提示提供输入。
如果我调用这个脚本,并将它赋给一个变量(以使输出操作更容易),提示符不会显示,因此您可以盲目地提供值,而不会实现您想要的。
例如,如果我直接调用脚本,我会在终端窗口中得到:

.\My-script-here.ps1

Number name
------ ----
     1 Campus 1
     2 Campus 2

Enter number of campus:

如果我把它赋值给一个变量,我会得到:

$variable = .\My-script-here.ps1

Enter number of campus:

有没有一种方法可以让编译后的表在将脚本赋值给变量时出现?当前脚本中的行是$Table | Format-Table -Property Number,Name,我尝试将其通过管道传输到Write-Output,但这没有什么区别

von4xj4u

von4xj4u1#

如果你想打印一个格式正确的表格到 display only,使用Out-Host
一个简单的例子:

[PSCustomObject]@{
  Foo = 'Bar'
  Baz = 42
} | 
  Format-Table |
  Out-Host

Read-Host 'Enter number of campus'

上面的命令将格式化的表格直接打印到主机显示器上(仅),因此不会被$variable = …赋值捕获,并且 * 无条件地 * 打印-仅捕获Read-Host响应。
如果你想 * 也 * 输出表 * 作为数据 *,以便它被捕获在$variable中,PowerShell (Core) 7+启用了一个方便的Tee-Object解决方案,使用CON(在Windows上)//dev/tty(在Unix上)作为-FilePath参数(代表控制台/终端设备):

# PowerShell 7+ only
[PSCustomObject]@{
  Foo = 'Bar'
  Baz = 42
} | Tee-Object -FilePath ($IsWindows ? '\\.\CON' : '/dev/tty')

Read-Host 'Enter number of campus'

现在,该表将打印 * 和 *,并在$variable中捕获(沿着Read-Host响应)。
然而,该解决方案依赖于数据触发 implicitFormat-Table
例如,如果你的数据默认以 list 格式显示,你需要一个 explicitFormat-Table调用,这会使事情变得复杂:

  • 除非你真的想捕获Format-Table发出的 * 格式化指令 ,否则你必须 * 避免 * 将其用于输出 * 数据 * -Format-* cmdlet应该只用于生成 * 显示 * 输出,而不是用于编程处理的 * 数据-有关背景信息,请参阅this answer
  • 在这种情况下,您将需要一个两步的方法,如下面针对Windows PowerShell所述,即使在PowerShell 7+中也是如此。

不幸的是,Windows PowerShell 不支持-FilePath CON,因此您需要首先在变量中收集输出,然后在两个单独的操作中输出并将其传递给Out-Host,或者使用this answer中显示的Tee-Host便利函数,该函数具有 * 流式传输 * 其输出的额外优势。

  • Windows PowerShell* /Format-Table解决方案(非流媒体):
# Capture the data in an aux. variable 
# and *print* it to the display.
# Note: 
#  * $table = ... by design only captures the *data*, not the Format-Table output.
#  * Enclosing the assignment in (...) passes the value *through*.
(
  $table = 
    [PSCustomObject]@{
      Foo = 'Bar'
      Baz = 42
    } 
) | Format-Table | Out-Host

# Now also *output* the data, so it can be captured.
$table

Read-Host 'Enter number of campus'

相关问题