2017-06-05 7 views
2

PowerShellスクリプトに標準入力(読み取りホスト)リダイレクトここではサンプルPowerShellスクリプトです

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スクリプトへのパイプ入力することはできません、ソリューションをお探しの方へ:私のPowerShellのバージョンテーブルが4.0.-1-1

は感謝

編集/結果語ります。 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 

また、あなたがparam一部せずに魔法変数$inputを使用することができます(私は完全にこのことを理解していないので、実際にそれをお勧めすることはできません):

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にリダイレクトするには、スクリプト内の 'Read-Host'以外に何かがある必要があると思います。 – gms0ulman

+0

ありがとうございます。 「このコマンドレットに入力をパイプすることはできません」という巨大な注釈は表示されませんでした。 – Peanut

1

Read-Hostに入力をパイプすることはできませんが、そうする必要はありません。

PowerShellはまだ入力リダイレクト(<)をサポートしていません。実際には、はb | a(すなわち、aへの入力としてbの出力を送る)と書き換えることができるので、(重要な)制限ではありません。

PowerShellは、パラメータの値がなくて必須の属性として設定されている場合、パラメータの入力を求めることができます。たとえば:あなたは$TheValueパラメータの入力を

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

提供していない場合は、PowerShellはそれのために要求されます。

また、パラメーターがパイプライン入力を受け入れるように指定することもできます。例:

Input: A 
Input: B 
Input: C 

このすべては、PowerShellのドキュメントではかなり簡潔に綴られている:あなたは、関数が出力されます、次の

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

を書くのであれば

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

+0

スニペットありがとう。私は「そうする必要はない」と同意しますが、QAが再認証する必要があるため、更新したくないpowershellファイルがある場合もあります。それが人生だ。 – Peanut

+0

'<'は入力リダイレクションのためにPowerShellでは動作しませんので、実際には選択肢がありません。 –

関連する問題