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

时间:2017-06-05 14:50:04

标签: powershell

这是一个示例PowerShell脚本:

$in = read-host -prompt "input"
write-host $in

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

hello

我们想要从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

即使只是试图回应输入也不起作用:

echo hi | \.test.ps1

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

注意:我的powershell版本表说4.0.-1.-1

由于

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

4 个答案:

答案 0 :(得分:2)

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

试试这个:

param(
    [parameter(ValueFromPipeline)]$string
)

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

Write-Host $in

或者,您可以使用不具有$input部分的魔术变量param(我不完全理解这一点,因此无法推荐):

Write-Host $input

答案 1 :(得分:1)

您无法将输入传输到Read-Host,但不需要这样做。

PowerShell还不支持输入重定向(<)。在实践中,这不是(重大)限制,因为a < b可以重写为b | a(即,将b的输出作为a的输入发送。)

如果缺少参数的值并且将其设置为必需属性,PowerShell可以提示输入参数。例如:

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

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

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

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

所以,如果你写

"A","B","C" | test

该功能将输出以下内容:

Input: A
Input: B
Input: C

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

答案 2 :(得分:1)

是;在Powershell 5.1中未实现“ <”(很糟糕)

因此,这将不起作用:tenkeyf

但是

这将:输入c:\ users \ marcus \ work \ data.num | tenkeyf

...

答案 3 :(得分:0)

PowerShell 没有重定向机制,但 .NET 有。

你可以使用[System.Diagnostics.Process]来实现重定向输入的目的。

微软相关文档如下。

Process Class

这是一个在我的 Windows 10 计算机上完美运行的示例程序

function RunAndInput{
    $pi = [System.Diagnostics.ProcessStartInfo]::new()
    $pi.FileName ="powershell"
    $pi.Arguments = """$PSScriptRoot\receiver.ps1"""
    $pi.UseShellExecute = $false
    $pi.RedirectStandardInput = $true
    $pi.RedirectStandardOutput = $true

    $p = [System.Diagnostics.Process]::Start($pi)

    $p.StandardInput.WriteLine("abc"+ "`r`n");
    $p.StandardOutput.ReadToEnd()
    $p.Kill()
}

RunAndInput

# OutPut

Please enter the information: abc
Received:abc

# receiver.ps1
('Received:' + (Read-Host -Prompt 'Please enter the information'))

希望能帮到你!