将标准输入(读取主机)重定向到 Powershell 脚本

Pea*_*nut 5 powershell

这是一个示例 powershell 脚本:

$in = read-host -prompt "input"
write-host $in
Run Code Online (Sandbox Code Playgroud)

这是一个示例“test.txt”文件:

hello
Run Code Online (Sandbox Code Playgroud)

我们希望将管道输入从 powershell 传递给它。这是我尝试过的一些:

.\test.ps1 < test.txt
.\test.ps1 < .\test.txt
.\test.ps1 | test.txt
.\test.ps1 | .\test.txt
test.txt | .\test.ps1
.\test.txt | .\test.ps1
get-content .\test.txt | .\test.ps1
Run Code Online (Sandbox Code Playgroud)

即使只是尝试回显输入也不起作用:

echo hi | \.test.ps1
Run Code Online (Sandbox Code Playgroud)

上面的每个不产生错误的示例总是提示用户而不是接受管道输入。

注意:我的 powershell 版本表显示为 4.0.-1.-1

谢谢

编辑/结果:对于那些寻找解决方案的人来说,您无法将输入通过管道传输到 powershell 脚本。您必须更新您的 PS 文件。请参阅下面的片段。

Bil*_*art 5

您无法将输入通过管道传输到Read-Host,但应该没有必要这样做。

PowerShell 尚不支持输入重定向 ( <)。实际上,这不是一个(重要的)限制,因为a < b可以重写为b | a(即,将 的b输出发送为 的输入a)。

如果参数值缺失并且被设置为强制属性,PowerShell 可以提示输入参数。例如:

function test {
  param(
    [parameter(Mandatory=$true)] [String] $TheValue
  )
  "You entered: $TheValue"
}
Run Code Online (Sandbox Code Playgroud)

如果您不提供$TheValue参数输入,PowerShell 将提示输入。

此外,您可以指定参数接受管道输入。例子:

function test {
  param(
    [parameter(ValueFromPipeline=$true)] [String] $TheValue
  )
  process {
    foreach ( $item in $TheValue ) {
      "Input: $item"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以如果你写

"A","B","C" | test
Run Code Online (Sandbox Code Playgroud)

该函数将输出以下内容:

Input: A
Input: B
Input: C
Run Code Online (Sandbox Code Playgroud)

所有这些都在 PowerShell 文档中非常简洁地阐明。


gms*_*man 4

问题是您的脚本\.test.ps1不期望该值。

尝试这个:

param(
    [parameter(ValueFromPipeline)]$string
)

# Edit: added if statement
if($string){
    $in = "$string"
}else{
    $in = read-host -prompt "input"
}

Write-Host $in
Run Code Online (Sandbox Code Playgroud)

$input或者,您可以使用没有部分的魔术变量param(我不完全理解这一点,所以不能真正推荐它):

Write-Host $input
Run Code Online (Sandbox Code Playgroud)