La commande de copie de Windows peut-elle gérer plusieurs fichiers?

7

Sur un système Unix, cette commande copie deux fichiers dans un dossier nommé folder:

cp foo bar folder

Sous Windows, cette commande n'est pas valide:

copy foo bar folder
The syntax of the command is incorrect.

Puis-je faire cela en une seule commande sous Windows, en utilisant ses outils intégrés?

Kevin Panko
la source
1
Peut-être que ce travail est préférable de laisser à Powershell.
Kevin Panko

Réponses:

5
for %I in (file1.txt file2.txt file3.txt) do copy %I c:\somedir\

Vous pouvez l'utiliser dans un fichier de commandes ou directement à partir de la ligne de commande. Pas aussi propre que * nix, mais ça marche.

steve.lippert
la source
Je confirme que cela fonctionne. Peut-être que s'il était emballé dans un fichier batch, vous pourriez le raccourcir? Donc, je n'aurais besoin que de taper stevecopy foo bar [...] folderet il ferait cette boucle automatiquement.
Kevin Panko
Je ne suis pas obligé de terminer ce 100% maintenant, mais pour commencer: pour %%, je (% *) copie% I c: \ somedir \. Powershell peut être un meilleur ajustement pour quelque chose comme ça, mais c'est une installation supplémentaire.
steve.lippert le
Cela fait trop longtemps que je travaille dessus et je ne peux toujours pas faire fonctionner quelque chose. Le mieux que je puisse faire pour vous est la réponse.
steve.lippert
Merci pour l'effort. J'ai posté ma version basée sur votre idée.
Kevin Panko
2
Vous voudrez mettre votre deuxième% I entre guillemets comme meilleure pratique pour gérer les espaces dans le nom du fichier
Goyuix Le
6

Windows inclut Robocopy intégré, qui copie plusieurs fichiers à partir d'une seule commande:

robocopy a\source\folder a\dest\folder file1.docx file2.exe
Edward Brey
la source
3

Il est à noter que si vous avez une expression générique plutôt qu'une liste explicite de fichiers, COPY copie tous les fichiers dans le répertoire cible:

COPY srcdir\* destdir\
COPY *sy?.* anotherdestdir\

Toute personne venant d'un contexte * nix trouverait cela très déroutant de voir que les listes explicites ne fonctionnent pas, car dans les shells de type Unix, il est impossible de les distinguer d'un programme - le shell développe tous les caractères génériques; liste de fichiers de toute façon. Ceci ne s'applique pas ici car le shell de commande Windows transmet directement les caractères génériques aux programmes et leur appartient de faire l'expansion. (COPY est également une commande intégrée au shell plutôt qu’un programme externe tel que cp sous Linux, donc, en principe, elle pourrait potentiellement enfreindre les règles habituelles concernant les arguments en ligne de commande, mais cela ne s’applique pas ici.)

Arthur Tacca
la source
Comment cela aide-t-il à résoudre le problème? Pouvez-vous créer un joker pour foo|bar?
Kevin Panko
@ Kevin Vous pourriez utiliser ??? s'il n'y a pas d'autres noms de fichier à trois caractères :-) Les seuls caractères génériques DOS sont * et? alors vous avez raison, ce n'est pas une solution générale. Mais comme le dit la deuxième partie de ma réponse, je craignais que certaines personnes ne souhaitent utiliser que des caractères génériques, mais avoir une fausse impression des autres réponses fournies ici.
Arthur Tacca
1

Voici un court script par lots pour faciliter la copie de plusieurs fichiers:

set FOLDER=%1

shift

for %%i in (%1 %2 %3 %4 %5 %6 %7 %8 %9) do copy %%i %FOLDER%

Usage:

my-copy <DEST-FOLDER> source [source2, source3, ...]
Kevin Panko
la source
mieux: for %%in (%*) do copy ...et puis le nombre de fichiers dans les fichiers n’est pas limité à 10 (toujours limité, mais 255 est un peu plus de marge :). Oh, et vous n'avez pas besoin non SHIFTplus. Plus: ss64.com/nt/syntax-args.html
matt wilkie
Je ne sais pas si je comprends - veux-tu dire copy %%i %1? Cela pourrait fonctionner, mais cela essaierait de copier le premier argument sur lui-même, ce qui ne ferait que créer un message d'erreur inoffensif.
Kevin Panko
0

Essayer

copy foo + bar folder
Michael
la source
1
Ce n'est pas ce que je voulais. Cela me donne un fichier, nommé dossier \ foo, avec le contenu à la fois de foo et de bar. Je veux finir avec le dossier \ foo et le dossier \ bar.
Kevin Panko
Cela concatène les fichiers foo et bar. Son équivalent * nix estcat foo bar > folder
ThatGraemeGuy le
1
Tu veux direcat foo bar > folder/foo
Kevin Panko
1
Ouais, on dirait que je me suis trompé. Si vous avez accès à Powershell dans votre environnement Windows, vous pourrez peut-être vous renseigner. Un grand nombre des commandes * nix sont reportées.
Michael
Bon point! Je l'ai
Kevin Panko