2017-09-05 177 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. 

> 

爲什麼「系統無法找到指定的文件」,從僅具有管道命令行?

回答

1

使用echo代替type表明,膨脹是在最後一個命令尋找d.txt代替%v%.txt完成,它似乎與|該行被解析兩次。

另一個例子:

set a=^%b^% 

set b=10 

echo %a% 

echo %a% | sort 
+0

完全正確。該命令首先在運行批處理文件的'cmd'實例中解析('%% F - >%v%.txt')。管道的每一側都由一個新的單獨的'cmd'實例來處理,該實例解析('%v%.txt - >「d」.txt')並執行該命令。 –

+0

@MC ND,哇,這是愚蠢的。那是如何預計工作,我想知道? 謝謝。 – ChrisJJ

+1

@ChrisJJ,管道將左側的* process *的sdtout連接到右側的* process *的stdin。雖然不是唯一的解決方案,但是它早在unix版本之後就已經實現了,而且它就像bash一樣在今天實現。它可以工作,但它有時會咬你的怪癖。 –

相關問題