2017-09-05 2 views
0

Avec un fichier% v% présent txt, ce fichier batch:Pourquoi cette commande canalisée échoue-t-elle?

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) 

produit

>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. 

> 

Pourquoi « Le système ne peut pas trouver le fichier spécifié » à partir de seulement la ligne ayant la commande courante?

Répondre

1

à l'aide echo au lieu de type montre que l'expansion se fait dans la dernière commande à la recherche de d.txt au lieu de %v%.txt, il semble que la ligne avec | est analysé deux fois.

un autre exemple:

set a=^%b^% 

set b=10 

echo %a% 

echo %a% | sort 
+0

tout à fait raison. La commande est d'abord analysée dans l'instance 'cmd' exécutant le fichier batch (' %% F ->% v% .txt'). Chaque côté du canal est géré par une nouvelle instance 'cmd' distincte qui analyse ('% v% .txt -> "d" .txt') et exécute la commande. –

+0

@MC ND, Wow, c'est idiot. Comment était-ce jamais prévu de travailler, je me demande ?? Merci. – ChrisJJ

+1

@ChrisJJ, les tuyaux connectent le sdtout du * processus * du côté gauche au stdin du * processus * du côté droit. Bien que n'étant pas la seule solution, elle a été implémentée de cette façon depuis les premières versions d'Unix et c'est ainsi que les shell comme Bash l'implémentent aujourd'hui. Cela fonctionne, mais il y a des bizarreries qui vous mordent parfois. –