Arquivo BATCH pede arquivo ou pasta

Eu tenho uma cópia simples do script para um dos nossos caras que está faltando um arquivo de 20 km da minha mesa

ao testar o script, sou perguntado se meu arquivo shapes.atc é um arquivo ou uma pasta

Eu posso te dizer que é um arquivo, mas como posso autocopiá-lo sobre o meu cara precisa ser capaz de apenas clicar no lote terminado

 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 

Um truque aparentemente não documentado é colocar um * no final do destino – então o xcopy copiará como um arquivo, assim

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

O echo f | xcopy ... echo f | xcopy ... truque echo f | xcopy ... não funciona em versões localizadas do Windows, em que o prompt é diferente.

Na verdade, xcopy não pergunta se o arquivo original existe, mas se você deseja colocá-lo em uma nova pasta chamada Shapes.atc ou na pasta Support (que é o que você deseja).

Para evitar que o xcopy pergunte isso, apenas informe a ele a pasta de destino, para que não haja ambigüidade:

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

Se você quiser alterar o nome do arquivo no destino, apenas use copy (que é mais adaptado que xcopy ao copiar arquivos):

 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 

O truque real é: Use uma barra invertida no final do caminho de destino para onde copiar o arquivo. O / Y é para sobrescrever arquivos existentes, se você não quiser avisos.

Exemplo:

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

Referenciando Arquivo de Força do XCopy

Para forçar arquivos, poderíamos usar o 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 

Para forçar uma pasta, poderíamos usar o parâmetro / i para xcopy ou usar uma barra invertida () no final da pasta de destino.

A opção / i pode ser a sua depois.

De xcopy /?

/ I Se o destino não existir e copiar mais de um arquivo, presume-se que o destino deva ser um diretório.

Bem, para a tarefa que me foi pedida, a melhor solução talvez fosse o seguinte comando de acordo com o conselho incompleto de 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 

Isso funciona para esta tarefa simples de cópia de arquivos

  • especificando apenas o diretório de destino em vez do arquivo de destino e
  • terminando o diretório de destino com uma barra invertida, o que é muito importante, caso contrário, o XCOPY faria mesmo com /I solicitando um arquivo ou diretório para copiar apenas um único arquivo.

Os outros parâmetros não relacionados à questão são:

  • /Q … quieto
  • /Y … sim (independente do idioma do sistema operacional) sobrescrever o arquivo existente
  • /R … sobrescrever também arquivos somente leitura, ocultos e do sistema
  • /S … do diretório especificado e de todos os subdiretórios.

Bem, eu não sei se /S é realmente necessário aqui porque não está claro se apenas J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc deve ser copiado ou todos os Shapes.atc encontrados em qualquer lugar do diretório tree of J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file .

A explicação para os parâmetros pode ser lida abrindo uma janela de prompt de comando e executando a partir desta janela xcopy /? para obter a saída da ajuda para o XCOPY .


Mas nenhuma das soluções fornecidas funcionou para uma tarefa de cópia de arquivo na qual um único arquivo deve ser copiado no mesmo diretório do arquivo de origem, mas com um nome de arquivo diferente, pois a data e a hora atuais são inseridas no nome do arquivo antes da extensão do arquivo.

O arquivo de origem pode ter um conjunto de atributos ocultos ou do sistema, o que exclui o uso do comando COPY .

O arquivo em lotes para criar o arquivo com data e hora deve funcionar também no Windows XP, o que exclui o ROBOCOPY porque, por padrão, não está disponível no Windows XP.

O arquivo de lote deve funcionar com qualquer arquivo, incluindo arquivos não típicos, como .gitconfig ou .htaccess que são arquivos sem extensão de arquivo, começando com um ponto para ocultá-los em sistemas * nix. O processador de comandos do Windows interpreta esses arquivos como arquivos sem nome de arquivo e tendo apenas uma extensão de arquivo devido à regra de que tudo após o último ponto é a extensão do arquivo e tudo o que ocorreu antes do último ponto é o nome do arquivo.

Para obter uma descrição completa da tarefa e a solução final totalmente comentada, consulte a publicação Criar uma cópia de backup dos arquivos no fórum do UltraEdit.

As soluções de Patrick , Tirtha R , Interociter Operator e CharlesB não funcionam porque usar /Y não evita o prompt de arquivo ou diretório se o arquivo de destino ainda não existir.

As soluções de Andy Morris e grenix não podem ser usadas para a tarefa de cópia de arquivo único, pois o destino deve ser o nome do arquivo de destino e não o nome do diretório de destino. O diretório de destino é o mesmo que o diretório de origem, mas o nome do arquivo de destino é diferente do nome do arquivo de origem.

As soluções de DosMan e Govert simplesmente não funcionam para arquivos que começam com um ponto e não possuem uma extensão de arquivo.

Por exemplo, o comando

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

resulta na seguinte mensagem de erro na execução:

Português: Não foi possível expandir o segundo nome do arquivo para coincidir primeiro.
Alemão: Zweiter Dateiname konnte nicht so erweitert werden, dass er zum ersten passt.

E, finalmente, a solução de Denis Ivin tem a restrição de que o caractere dependente do idioma do sistema operacional para um atendimento automático do prompt do diretório OR do arquivo deve ser conhecido.

Então eu pensei sobre methods para obter F para arquivo no Windows em inglês ou D para Datei no Windows em alemão ou ? para … no … Windows automaticamente.

E é de fato possível determinar o caractere dependente do idioma para um atendimento automático do prompt.

Um hack é usado para obter a letra dependente do idioma do texto do prompt sem realmente copiar qualquer arquivo.

O comando XCOPY é usado para iniciar a cópia do próprio arquivo em lotes para a pasta de arquivos temporários, com a extensão do arquivo sendo TMP para o arquivo de destino. Isso resulta em um prompt do XCOPY se ainda não houver um arquivo com esse nome na pasta de arquivos temporários, o que é muito improvável.

O manipulador do dispositivo NUL é usado como um manipulador de input para XCOPY, resultando na quebra do processo de cópia após a saída do XCOPY duas vezes.

Essa saída é processada em um loop FOR que é encerrado na primeira linha, iniciando com um parêntese de abertura. Esta é a linha na qual o segundo caractere define a letra a ser usada para especificar que o destino é um arquivo.

Aqui está um arquivo em lote usando XCOPY com o código para determinar a letra exigida para um atendimento automático do prompt de arquivo ou diretório para criar uma cópia marcada com hora de um único arquivo no mesmo diretório do arquivo de origem, mesmo que o arquivo de origem esteja oculto ou arquivo de sistema e mesmo se o arquivo de origem começar com um ponto e não tiver uma extensão de arquivo.

 @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" ^

Esse código de lote foi testado no Windows XP SP3 x86 em alemão e em inglês no Windows 7 SP1 x64.

Veja o post Crie uma cópia de backup dos arquivos no fórum do UltraEdit para um arquivo em lote similar, totalmente comentado, explicando todas as partes do código do lote.

Para entender os comandos usados ​​e como eles funcionam, abra uma janela de prompt de comando, execute os seguintes comandos e leia com atenção todas as páginas de ajuda exibidas para cada comando.

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

Além disso, o artigo da Microsoft sobre o uso de operadores de redirecionamento de comandos também deve ser lido.

O truque de acrescentar “*” pode funcionar quando a nova extensão for mais curta. Você precisa preencher a nova extensão com espaços em branco, o que só pode ser feito colocando o nome do arquivo de destino entre aspas. Por exemplo:

 xcopy foo.shtml "foo.html *" 

Isso irá copiar e renomear sem avisar.

“Isso não é um bug, é um recurso!” (Eu vi uma VW Beetle no estacionamento da Microsoft com a placa de vaidade “FEATURE”.) Essas semânticas para renomear remontam a quando eu escrevi o DOS v.1. Caracteres no novo nome são substituídos um por um para caracteres no nome antigo, a menos que um caractere curinga (? Ou *) esteja presente no novo nome. Sem adicionar o (s) espaço (s) ao novo nome, os caracteres restantes são copiados do nome antigo.

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

..deve fazê-lo.

Boa idéia para fazer um:

 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 

(supondo que você tenha feito uma renomeação da versão anterior para .old)

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

O truque virtual dos pais

Supondo que você tenha seu arquivo de origem e de destino

 %SRC_FILENAME% and %DST_FILENAME% 

você poderia usar um método de 2 etapas:

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

isso seria resolvido, por exemplo,

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

Eu cheguei à ideia quando tropecei em algumas realmente loucas ../..-constructos nas linhas de comando geradas a partir de um processo de construção.

Eu tive exatamente o mesmo problema, onde é necessário copiar um arquivo em um disco rígido externo para fins de backup. Se eu quisesse copiar uma pasta completa, o COPY ficou feliz em criar a pasta de destino e preenchê-la com todos os arquivos. No entanto, eu queria copiar um arquivo uma vez por dia e adicionar a data de hoje ao arquivo. A COPY ficou feliz em copiar o arquivo e renomeá-lo no novo formato, mas apenas enquanto a pasta de destino já existisse.

meu comando de cópia ficou assim:

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

Como você, eu procurei por switches alternativos ou outros comandos do tipo copy, mas nada funcionou como eu queria. Então pensei em dividir os dois requisitos diferentes, simplesmente adicionando um comando make directory (MD ou MKDIR) antes do comando copy.

Então agora eu tenho

MKDIR D: \ DESTFOLDER

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

Se a pasta de destino NÃO existir, ela será criada. Se a pasta de destino existir, ela gerará uma mensagem de erro. MAS, isso não impedirá que o arquivo em lote continue com o comando copy.

A mensagem de erro diz: Um subdiretório ou arquivo D: \ DESTFOLDER já existe

Como eu disse, a mensagem de erro não impede que o arquivo em lote funcione e é uma solução realmente simples para o problema.

Espero que isso ajude.