Il file BATCH richiede il file o la cartella

Ho una semplice copia da scrivere per uno dei nostri ragazzi che manca un file a 20 km dalla mia scrivania

quando provo lo script, mi viene richiesto se il mio file shapes.atc è un file o una cartella

Posso dirti che è un file, ma come posso autocoparlo sul mio ragazzo deve essere in grado di fare clic sul batch finito

 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 

    Un trucco apparentemente privo di documenti è quello di mettere un * alla fine della destinazione – quindi xcopy verrà copiato come un file, come in questo caso

     xcopy c:\source\file.txt c:\destination\newfile.txt* 

    L’ echo f | xcopy ... echo f | xcopy ... trucco non funziona su versioni localizzate di Windows, dove il prompt è diverso.

    In realtà xcopy non ti chiede se il file originale esiste, ma se vuoi metterlo in una nuova cartella chiamata Shapes.atc, o nella cartella Support (che è quello che vuoi.

    Per evitare che xcopy lo chieda, digli semplicemente la cartella di destinazione, quindi non c’è alcuna ambiguità:

     xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support" 

    Se vuoi cambiare il nome del file nella destinazione usa solo copia (che è più adatta di xcopy quando copia i file):

     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 

    Il vero trucco è: utilizzare una barra rovesciata alla fine del percorso di destinazione in cui copiare il file. Il / Y serve per sovrascrivere i file esistenti, se non si desidera alcun avviso.

    Esempio:

     xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\" 

    Riferimento a XCopy Force File

    Per forzare i file, potremmo usare la 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 

    Per forzare una cartella, potremmo usare / i parametro per xcopy o usare una barra rovesciata () alla fine della cartella di destinazione.

    L’opzione / i potrebbe essere il tuo dopo.

    Da xcopy /?

    / I Se la destinazione non esiste e copia più di un file, si presuppone che la destinazione sia una directory.

    Bene, per il compito richiesto da me solo la soluzione forse migliore sarebbe il seguente comando secondo il consiglio incompleto di Andy Morris :

     xcopy "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\" /Q /R /S /Y 

    Questo funziona per questo semplice compito di copia dei file a causa di

    • specificando solo la directory di destinazione invece del file di destinazione e
    • termina la directory di destinazione con un backslash che è molto importante in quanto altrimenti XCOPY avrebbe persino con /I prompt per file o directory sulla copia di un singolo file.

    Gli altri parametri non correlati alla domanda sono:

    • /Q … tranquillo
    • /Y … sì (lingua del sistema operativo indipendente) per sovrascrivere il file esistente
    • /R … sovrascrive anche il file di sola lettura, nascosto e di sistema
    • /S … dalla directory specificata e tutte le sottodirectory.

    Beh, non so se /S è davvero necessario qui perché non è chiaro se solo J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc deve essere copiato o tutti gli Shapes.atc trovati in qualsiasi directory albero di J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file .

    La spiegazione dei parametri può essere letta aprendo una finestra del prompt dei comandi e eseguendo da questa finestra xcopy /? per ottenere l’output dell’aiuto per XCOPY .


    Ma nessuna delle soluzioni fornite ha funzionato per un’attività di copia dei file su cui un singolo file dovrebbe essere copiato nella stessa directory del file sorgente, ma con un nome file diverso a causa della data e dell’ora correnti viene inserito nel nome del file prima dell’estensione del file.

    Il file sorgente può avere un set di attributi nascosti o di sistema che esclude l’utilizzo del comando COPY .

    Il file batch per la creazione del file con timestamp dovrebbe funzionare anche su Windows XP, il che esclude ROBOCOPY perché di default non è disponibile su Windows XP.

    Il file batch dovrebbe funzionare con qualsiasi file che includa file non tipici come .gitconfig o .htaccess che sono file senza estensione di file che iniziano con un punto per nasconderli su sistemi * nix. Il processore dei comandi di Windows interpreta tali file come file senza nome di file e avendo solo un’estensione di file a causa della regola che tutto dopo l’ultimo punto è l’estensione del file e tutto prima che l’ultimo punto sia il nome del file.

    Per una descrizione completa dell’attività e la soluzione finale, completamente commentata, consultare il post Creare una copia di backup dei file nel forum UltraEdit.

    Le soluzioni di Patrick , Tirtha R , Interociter Operator e CharlesB non funzionano perché l’uso di /Y non evita il prompt di file o directory se il file di destinazione non esiste già.

    Le soluzioni di Andy Morris e Grenix non possono essere utilizzate per l’attività di copia di file singoli poiché la destinazione deve essere il nome del file di destinazione e non il nome della directory di destinazione. La directory di destinazione è la stessa della directory di origine, ma il nome del file di destinazione è diverso dal nome del file di origine.

    Le soluzioni DosMan e Govert semplicemente non funzionano per i file che iniziano con un punto e che non hanno un’estensione di file.

    Ad esempio il comando

     xcopy C:\Temp\.gitconfig C:\Temp\.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y 

    risultati nel seguente messaggio di errore sull’esecuzione:

    Inglese: imansible espandere il nome del secondo file in modo che corrisponda per primo.
    Tedesco: Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt.

    E infine la soluzione di Denis Ivin ha la limitazione che il carattere dipendente dalla lingua del sistema operativo per una risposta automatica del prompt della directory OR del file deve essere noto.

    Così ho pensato ai metodi per ottenere F per File in inglese Windows o D per Datei su Windows tedesco o ? per … su … Windows automaticamente.

    Ed è infatti ansible determinare il carattere dipendente dalla lingua per una risposta automatica del prompt.

    Viene usato un hack per ottenere la lettera dipendente dalla lingua dal testo immediato senza copiare realmente alcun file.

    Comando XCOPY viene utilizzato per avviare la copia del file batch stesso nella cartella per i file temporanei con estensione file che è TMP per il file di destinazione. Ciò si traduce in una richiesta da parte di XCOPY se non c’è già un file con quel nome nella cartella dei file temporanei che è molto improbabile.

    Il gestore del dispositivo NUL viene utilizzato come gestore di input per XCOPY, con conseguente interruzione del processo di copia dopo che il prompt viene emesso da XCOPY due volte.

    Questo output viene elaborato in un ciclo FOR che viene chiuso sulla prima riga a partire da una parentesi di apertura. Questa è la linea su cui il secondo carattere definisce la lettera da utilizzare per specificare che la destinazione è un file.

    Ecco un file batch che utilizza XCOPY con il codice per determinare la lettera richiesta per una risposta automatica del prompt del file o della directory per creare una copia con timestamp di un singolo file nella stessa directory del file sorgente anche se il file di origine è nascosto o file di sistema e anche se il file sorgente inizia con un punto e non ha un’estensione di file.

     @echo off rem Batch file must be started or called with name of a single file. if "%~1" == "" exit /B for /F "delims=*?" %%I in ("#%~1#") do if not "%%I" == "#%~1#" exit /B if not exist "%~1" exit /B if exist "%~1\" exit /B setlocal EnableDelayedExpansion rem Determine the character needed for answering prompt of rem XCOPY for destination being a file and not a directory. del /F "%TEMP%\%~n0.tmp" 2>nul for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%~f0" "%TEMP%\%~n0.tmp" ^

    Questo codice batch è stato testato su Windows XP SP3 x86 tedesco e Windows 7 SP1 inglese x64.

    Vedere il post Creare una copia di backup dei file nel forum UltraEdit per un file batch simile, completamente commentato che spiega tutte le parti del codice batch.

    Per capire i comandi usati e come funzionano, apri una finestra del prompt dei comandi, esegui i seguenti comandi e leggi attentamente tutte le pagine di aiuto visualizzate per ciascun comando.

    • del /?
    • echo /?
    • exit /?
    • for /?
    • goto /?
    • if /?
    • rem /?
    • set /?
    • setlocal /?
    • wmic OS get /?
    • xcopy /?

    Inoltre , dovrebbe essere letto anche l'articolo di Microsoft sull'utilizzo degli operatori di reindirizzamento dei comandi .

    Il trucco di aggiungere “*” può essere fatto funzionare quando la nuova estensione è più breve. È necessario riempire la nuova estensione con spazi vuoti, operazione che può essere eseguita solo racchiudendo il nome del file di destinazione tra virgolette. Per esempio:

     xcopy foo.shtml "foo.html *" 

    Questo verrà copiato e rinominato senza chiedere conferma.

    “Questo non è un bug, è una caratteristica!” (Una volta ho visto un Maggiolino VW nel parcheggio Microsoft con la piastra di cortesia “FEATURE”.) Queste semantiche per la rinomina risalgono a quando ho scritto DOS v.1. I caratteri nel nuovo nome vengono sostituiti uno per uno per i caratteri nel vecchio nome, a meno che nel nuovo nome non sia presente un carattere jolly (? O *). Senza aggiungere gli spazi vuoti al nuovo nome, i caratteri rimanenti vengono copiati dal vecchio nome.

     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\*.*" 

    .. dovresti farlo

    Buona idea di fare 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 

    (presumendo che tu abbia rinominato la versione precedente in .old)

     XCOPY /Z <----- restartable mode - good for large files. 

    Il trucco genitore virtuale

    Supponendo di avere il tuo file di origine e destinazione

     %SRC_FILENAME% and %DST_FILENAME% 

    potresti usare un metodo in 2 passaggi:

     @REM on my win 7 system mkdir creates all parent directories also mkdir "%DST_FILENAME%\.." xcopy "%SRC_FILENAME% "%DST_FILENAME%\.." 

    questo sarebbe risolto per es

     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\). 

    Mi è venuta l’idea quando sono incappato in qualcosa di veramente selvaggio … / … -costruzioni nelle righe di comando generate da un processo di compilazione.

    Ho avuto esattamente lo stesso problema, dove si desidera copiare un file in un disco rigido esterno per scopi di backup. Se volevo copiare una cartella completa, allora COPY era abbastanza felice di creare la cartella di destinazione e popolarla con tutti i file. Tuttavia, volevo copiare un file una volta al giorno e aggiungere la data di oggi al file. COPY era felice di copiare il file e rinominarlo nel nuovo formato, ma solo fino a quando la cartella di destinazione esisteva già.

    il mio comando di copia assomigliava a questo:

    COPY C: \ SRCFOLDER \ MYFILE.doc D: \ DESTFOLDER \ MYFILE_YYYYMMDD.doc

    Come te, ho guardato in giro per commutatori alternativi o altri comandi di tipo copia, ma nulla ha funzionato come volevo. Poi ho pensato di dividere le due diverse esigenze semplicemente aggiungendo un comando make directory (MD o MKDIR) prima del comando copy.

    Quindi ora ho

    MKDIR D: \ DESTFOLDER

    COPY C: \ SRCFOLDER \ MYFILE.doc D: \ DESTFOLDER \ MYFILE_YYYYMMDD.doc

    Se la cartella di destinazione NON esiste, la crea. Se esiste la cartella di destinazione, allora genera un messaggio di errore .. MA questo non impedisce al file batch di continuare con il comando di copia.

    Il messaggio di errore dice: esiste già una sottodirectory o un file D: \ DESTFOLDER

    Come ho detto, il messaggio di errore non interrompe il funzionamento del file batch ed è una soluzione molto semplice al problema.

    Spero che questo aiuti.