Comment faire pour copier certains fichiers (w/o hiérarchie des dossiers), mais ne pas remplacer les fichiers existants?
J'ai besoin de copier tous les *.doc
fichiers (mais pas les dossiers dont les noms correspondent à *.doc
) à partir d'un dossier réseau \\server\source
(y compris les fichiers dans tous les dossiers imbriqués) dans un dossier local C:\destination
sans conserver les dossiers imbriqués de la hiérarchie (c'est à dire tous les fichiers doivent aller directement dans C:\destination
et pas de dossiers imbriqués doit être créé dans C:\destination
). Dans le cas où il y a plusieurs fichiers avec le même nom dans différents sous-dossiers de \\server\source
, seul le premier devrait être copié et jamais écrasé puis — toutes les fichiers trouvés plus tard doit être ignoré (il pourrait y avoir de nombreux cas de ce genre, et les fichiers ignorés ne doit pas être trasferred sur le réseau, sinon cela prendrait trop de temps). Voici ma tentative de le mettre en œuvre dans PowerShell:
cp \\server\source\* -Recurse -Include *.doc -Container:$false -Destination C:\destination
Il y a au moins deux problèmes avec cette commande:
- Il copie les dossiers dont les noms correspondent à
*.doc
trop. - En cas de conflit de noms de n'importe quel fichier trouvé, plus tard, est transféré sur le réseau et remplace la précédente.
Pouvez-vous suggérer comment résoudre ces problèmes?
Implémentations utilisant copy
, xcopy
, robocopy
, cscript
ou *.bat
, *.cmd
sont également les bienvenus.
Les locaux OS est Windows 8 et le système de fichiers est NTFS.
Le répertoire de destination peut être supposé initialement vide. Si cette condition préalable échoue, alors le comportement du script peut être indéfini.
OriginalL'auteur Vladimir Reshetnikov | 2013-07-05
Vous devez vous connecter pour publier un commentaire.
Je serait de produire la liste de fichiers et de valider que vous allez par le biais de la liste.
Quelque chose comme ceci:
Ainsi, l'utilisation de
Get-ChildItem
à la liste des fichiers dans le dossier source correspondant au filtre, tuyau à traverswhere-object
à la bande de répertoires.Puis allez à travers chaque fichier dans un
foreach
boucle et de vérifier si le nom de fichier (pas Fullname) existe dans la destination en utilisant laExists
méthode de lasystem.io.file
.NET de la classe.Si ça ne marche pas, copier, en utilisant uniquement le nom de fichier d'origine (chute de chemin d'origine).
Utiliser le
-whatif
option sur la copie lors de l'essai, de sorte qu'il n'affiche que ce qu'il faudrait faire, dans le cas où le résultat n'est pas ce que tu voulais 🙂Au lieu de
[system.io.file]::Exists
, vous devez également être en mesure d'utiliserTest-File
OriginalL'auteur Graham Gold
Les réponses précédentes semblent plutôt trop compliqué pour moi, si je ne suis malentendu quelque chose. Cela devrait fonctionner:
Aucun des commandes intégrées - copy, xcopy ou robocopy - à faire ce que vous voulez sur leur propre, mais il y a un utilitaire appelé xxcopy qui seront, disponibles chez http://www.xxcopy.com. Il a un certain nombre d'options intégrées spécifiquement pour l'aplatissement des arborescences de répertoires dans un répertoire unique. La suite à faire ce que vous avez décrit:
Cependant, xxcopy a diverses autres options de gestion des noms de fichiers doublons qu'une simple copie de la première rencontrée, telles que l'ajout de la source un nom de répertoire pour le nom de fichier, ou l'ajout séquentiel numérique identifie à tous mais la première, ou tous, mais les plus récents ou les plus anciens. Voir cette page pour plus de détails: http://www.xxcopy.com/xxcopy16.htm
Essayé votre choix (le premier) - c'est bon, mais il aplatit la hiérarchie
L'aplatissement de la hiérarchie a été l'objectif de la question: "sans la préservation des dossiers imbriqués de la hiérarchie (c'est à dire tous les fichiers doivent aller directement dans C:\destination et pas de dossiers imbriqués devraient être créés dans C:\destination)".
Désolé. Oubliée. Que votre réponse est correcte - il m'a aidé après quelques modifications. Merci
OriginalL'auteur Adi Inbar
OriginalL'auteur Aaron Jensen
Pourquoi utiliser foreach lorsque vous disposez déjà d'un pipeline? Propriétés calculées pour la victoire!
OriginalL'auteur Eris
Première ligne de lire chaque *.fichier doc et *.doc? (il se penche également sur Office 2010 .format docx), à l'exclusion de Répertoires et de fichiers en double.
Deuxième ligne de copie de chaque élément de la destination à la source (le dossier C:\destination doit déjà exister).
En général, je vous suggère de diviser la commande sur plusieurs lignes, car il est plus facile de produire du code (dans ce cas, la première tâche: obtenir des fichiers, deuxième tâche: copie de fichiers).
OriginalL'auteur Naigel