2017-09-05 5 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

사용하는 대신 typeecho이 확장 대신 %v%.txtd.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을 왼쪽의 * 프로세스 *에서 오른쪽의 * 프로세스 *의 stdin에 연결합니다. 유일한 해결책은 아니지만, 초기 유닉스 버전 이후에 그런 식으로 구현되어 왔으며 오늘날의 bash와 같은 쉘 방식으로 구현되었습니다. 그것은 작동하지만, 때로는 당신을 물지는 몇 가지 단점이 있습니다. –