web-dev-qa-db-fra.com

Le fichier BATCH demande un fichier ou un dossier

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
65
just me

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. 

164
Govert

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
19
CharlesB
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
11
Denis Ivin

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\"
10
Patrick

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. 

5
Shane Lu

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.

3
Andy Morris

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.

2
DosMan

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.

0
Chris Eaton

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.

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