Boucle Foreach sur la ligne de commande Windows?

J’ai une ligne de commande qui copie les fichiers du dossier A au dossier B:

copy A\* B\ 

Je voudrais maintenant supprimer tous les fichiers de B présents dans A, de manière non récursive. Je peux lister les fichiers dans A comme ceci:

 dir /b /ad A 

Avec la sortie étant:

 f0.txt f1.txt f2.txt 

Voici le pseudo-code pour ce que je voudrais faire:

 foreach $1 in : del B\$1 

Existe-t-il une syntaxe de ligne de commande Windows qui exécute une commande, en utilisant la sortie d’une autre commande comme entrée? Je suis au courant de l’opérateur de tuyauterie (|), mais je ne sais pas comment cela pourrait être utilisé pour accomplir cette tâche. Toute aide serait appréciée.

Ressortingction: Seules les commandes disponibles par défaut dans Windows 7.

Vous pouvez parcourir des fichiers avec

 for %x in (*) do ... 

ce qui est aussi beaucoup plus robuste que d’essayer d’itérer sur la sortie d’une commande pour ce cas d’utilisation.

Alors

 for %f in (A\*) do del "B\%~nxf" 

ou, si vous en avez besoin dans un fichier de commandes au lieu de la ligne de commande:

 for %%f in (A\*) do del "B\%%~nxf" 

%~nxf ne renvoie que le nom du fichier et l’extension de chaque fichier car il sera préfixé par A\ et que vous voulez le supprimer dans B.

Ajouter > nul 2>&1 pour supprimer toute sortie (des messages d’erreur peuvent apparaître lorsque vous essayez de supprimer des fichiers qui n’existent pas).


Pour être complet, vous pouvez en fait parcourir la sortie d’une commande de la même manière:

 for /f %x in ('some command') do ... 

mais il y a plusieurs problèmes à le faire et dans le cas de l’itération sur la sortie de dir c’est rarement nécessaire, donc je ne le recommande pas.


Et comme vous êtes sur Windows 7, vous disposez également de PowerShell:

 Get-ChildItem A\* | ForEach-Object { Remove-Item ('B\' + $_.Name) } 

ou plus court:

 ls A\* | % { rm B\$($_.Name) }