J'ai une simple copie de script pour un de nos gars qui manque un fichier à 20 km de mon bureau
lors du test du script, on me demande si mon fichier shapes.atc
est un fichier ou un dossier
Je peux vous dire que c'est un fichier, mais comment puis-je le copier automatiquement sur mon gars doit pouvoir cliquer sur le lot
xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc
Une astuce apparemment non documentée est de mettre un *
à la fin de la destination - alors xcopy
sera copié en tant que fichier, comme si
xcopy c:\source\file.txt c:\destination\newfile.txt*
L'astuce echo f | xcopy ...
ne fonctionne pas sur les versions localisées de Windows, où l'invite est différente.
En réalité, xcopy ne vous demande pas si le fichier d'origine existe, mais si vous souhaitez le placer dans un nouveau dossier nommé Shapes.atc, ou dans le dossier Support (ce que vous voulez.
Pour éviter que xcopy ne pose cette question, indiquez-lui simplement le dossier de destination, il n'y a donc aucune ambiguïté:
xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support"
Si vous voulez changer le nom du fichier dans la destination, utilisez simplement copy (qui est plus adapté que xcopy lors de la copie de fichiers):
copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc
echo f | xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc
La vraie astuce consiste à utiliser une barre oblique inverse à la fin du chemin cible pour copier le fichier. Le/Y sert à écraser des fichiers existants, si vous ne voulez pas d’avertissements.
Exemple:
xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\"
Référencement Fichier XCopy Force
Pour forcer les fichiers, nous pourrions utiliser pipeline "echo F |":
C:\Trash>xcopy 23.txt 24.txt
Does 24.txt specify a file name
or directory name on the target
(F = file, D = directory)?
C:\Trash>echo F | xcopy 23.txt 24.txt
Does 24.txt specify a file name
or directory name on the target
(F = file, D = directory)? F
C:23.txt
1 File(s) copied
Pour forcer un dossier, nous pourrions utiliser le paramètre/i pour xcopy ou utiliser une barre oblique inverse () à la fin du dossier de destination.
Le commutateur/i pourrait être ce que votre après.
De xcopy /?
/ I Si la destination n'existe pas et que vous copiez plus d'un fichier, suppose que la destination doit être un répertoire.
L'astuce d'ajouter "*" peut être utilisée lorsque la nouvelle extension est plus courte. Vous devez remplir la nouvelle extension avec des espaces, ce qui ne peut être fait qu'en mettant le nom du fichier de destination entre guillemets. Par exemple:
xcopy foo.shtml "foo.html *"
Cela va copier et renommer sans invite.
"Ce n'est pas un bug, c'est une fonctionnalité!" (J'ai déjà vu une VW Beetle dans le parking Microsoft avec la plaque signalétique "FEATURE".) Cette sémantique pour renommer remonte à l'époque où j'ai écrit DOS v.1. Les caractères du nouveau nom sont remplacés un à un par des caractères de l'ancien nom, sauf si un caractère générique (? Ou *) est présent dans le nouveau nom. Sans ajouter les espaces au nouveau nom, les caractères restants sont copiés à partir de l'ancien nom.
J'ai eu exactement le même problème, où est voulu copier un fichier sur un disque dur externe à des fins de sauvegarde . Si je voulais copier un dossier complet, alors COPY était assez heureux de créer le dossier de destination et de le remplir avec tous les fichiers . Cependant, je voulais copier un fichier une fois par jour et ajouter la date du jour au fichier . COPY était heureux de copier le fichier et de le renommer dans le nouveau format, mais uniquement tant que la destination dossier existait déjà.
ma commande de copie ressemblait à ceci:
COPIEC:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_AAAAMMJJ.doc
Comme vous, j’ai cherché des commutateurs alternatifs ou d’autres commandes de type copie, mais rien ne fonctionnait vraiment comme je le voulais… .. puis j’ai pensé à séparer les deux exigences différentes en ajoutant simplement une commande make directory (MD ou MKDIR). avant la commande de copie.
Alors maintenant j'ai
MKDIRD:\DESTFOLDER
COPIEC:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_AAAAMMJJ.doc
Si le dossier de destination n'existe PAS, il le crée . S'il existe, il génère un message d'erreur .. MAIS, cela n'empêche pas le fichier de traitement continu de passer à la commande de copie.
Le message d'erreur dit: Un sous-répertoire ou fichier D:\DESTFOLDER existe déjà
Comme je l'ai dit, le message d'erreur n'arrête pas le fonctionnement du fichier de commandes. Il s'agit d'une solution très simple au problème.
J'espère que cela aide.
L'astuce parent virtuel
En supposant que vous ayez votre fichier source et destination dans
%SRC_FILENAME% and %DST_FILENAME%
vous pouvez utiliser une méthode en 2 étapes:
@REM on my win 7 system mkdir creates all parent directories also
mkdir "%DST_FILENAME%\.."
xcopy "%SRC_FILENAME% "%DST_FILENAME%\.."
cela serait résolu par exemple
mkdir "c:\destination\b\c\file.txt\.."
@REM The special trick here is that mkdir can create the parent
@REM directory of a "virtual" directory (c:\destination\b\c\file.txt\) that
@REM doesn't even need to exist.
@REM So the directory "c:\destination\b\c" is created here.
@REM mkdir "c:\destination\b\c\dummystring\.." would have the same effect
xcopy "c:\source\b\c\file.txt" "c:\destination\b\c\file.txt\.."
@REM xcopy computes the real location of "c:\destination\b\c\file.txt\.."
@REM which is the now existing directory "c:\destination\b\c"
@REM (the parent directory of the "virtual" directory c:\destination\b\c\file.txt\).
Je suis venu à l’idée lorsque j’ai trébuché sur des structures vraiment sauvages ../..- dans les lignes de commande générées à partir d’un processus de construction.
xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\*.*"
..should le faire.
Bonne idée de faire un:
IF NOT EXIST "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\Shapes.atc" ECHO/ && ECHO/ && ECHO * * * * * COPY FAILED - Call JustME at 555-555-1212 && ECHO/ && pause
(en supposant que vous ayez renommé la version précédente en .old)
XCOPY /Z <----- restartable mode - good for large files.