2017-09-05 9 views
0

は、このバッチファイル:このパイプコマンドが失敗するのはなぜですか?ファイル%v%の.txtの存在で

PROMPT $g 
SET v="d" 
FOR %%F IN ("*.txt") DO (TYPE "%%F" ) 
FOR %%F IN ("*.txt") DO (SORT "%%F" ) 
FOR %%F IN ("*.txt") DO (TYPE "%%F" | SORT) 

>PROMPT $g 

>SET v="d" 

>FOR %F IN ("*.txt") DO (TYPE "%F" ) 

>(TYPE "%v%.txt" ) 
content 
>FOR %F IN ("*.txt") DO (SORT "%F" ) 

>(SORT "%v%.txt" ) 
content 

>FOR %F IN ("*.txt") DO (TYPE "%F" | SORT ) 

>(TYPE "%v%.txt" | SORT ) 
The system cannot find the file specified. 

> 

を生産するのはなぜ唯一の行がパイプされたコマンドを持っていることから、「システムは指定されたファイルを見つけることができませんか」? echo代わりのtypeを使用して

答えて

1

拡張がd.txt代わりの%v%.txtを探して最後のコマンドで行われていることを示し、|とラインが二回解析されているようです。

別の例:

set a=^%b^% 

set b=10 

echo %a% 

echo %a% | sort 
+0

完全に右。コマンドは、バッチファイル( '%% F - >%v%.txt')を実行している' cmd'インスタンスで最初に解析されます。パイプの各辺は( '%v%.txt - >" d ".txt')を解析してコマンドを実行する別個の' cmd'インスタンスによって処理されます。 –

+0

@MC ND、うわー、それはダムです。どのようにこれまでに動作することが期待された、私は不思議ですか?おかげさまで – ChrisJJ

+1

@ChrisJJでは、パイプはsdtoutを左側の* process *から右側の* process *のstdinに接続します。唯一の解決策ではありませんが、これは初期のUNIXバージョン以降に実装されており、今日のbashのようなシェルの実装方法です。それは動作しますが、時にはあなたを噛むいくつかの癖があります。 –

関連する問題