2017-06-05 80 views
2

下面是一个样本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文件。请参阅下面的摘录。

回答

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 
+0

所以人们必须编辑PS1文件来支持管道输入。有没有办法重定向标准输入?例如,在C#中,您可以简单地使用Console.ReadLine(),并且可以通过CMD管道连接到该控制台。您不会将任何参数传递给可执行文件,您将重定向输入。 – Peanut

+1

@Peanut可能有一种方法来获得你所追求的,这超出了我的知识范围。 ['Read-Host'文档](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/read-host)指定它不接受来自管道的值。为了获得_functionality_,我会使用'if'语句。为了将输入重定向到PowerShell,我相信在脚本 – gms0ulman

+0

中除了'Read-Host'外,还需要一些东西,谢谢您研究它。我没有看到巨大的注释,指出“您无法将输入传递到此cmdlet”。 – Peanut

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的文档中的拼写相当简洁。

+0

感谢您的摘录。我同意'不需要这样做',但在某些情况下,我们有一个我们不想更新的PowerShell文件,因为这会导致QA需要重新验证它。这就是人生。 – Peanut

+0

'<'在PowerShell中无法用于输入重定向,因此您没有真正的选择。 –

相关问题