Renomear e mover o arquivo em massa

2

Estou procurando um método baseado em Windows / Dos para renomear e copiar / mover arquivos com base em um conteúdo de arquivo de importação CSV.

Por exemplo:

Import file example:

"C:\Dir1\File001.txt","Q:\Dir02\Dir03\Dir04\NewFile001.txt"
"C:\Dir2\File002.txt","Q:\Dir05\Dir06\Dir07\NewFile002.txt"
"C:\Dir3\File003.txt","Q:\Dir08\Dir09\Dir10\NewFile003.txt"

O que eu preciso

Idealmente, o método levaria os itens acima como arquivos de entrada e cópia / movimentação da Coluna 1 para a Coluna 2 enquanto criava os diretórios necessários.

Também estou procurando algum tratamento de erros, como

  • Não é possível criar diretório / pasta (por qualquer motivo)
  • Arquivo já existe - no destino ou porque a entrada de renomeação coloca dois arquivos com o mesmo nome no mesmo diretório.
  • Tenha uma maneira de lidar com colisões (adicione o sufixo, etc.).

O que eu tentei

Já experimentei os aplicativos a seguir, mas não consegui fazer com que funcionassem como eu queria, então quis ver se há um método diferente em vez de um software que fará esse tipo de operação com o Windows:

  1. Bulk Rename Utility

    • Tentou usar a função "Pares de importação", mas não obteve resultados. (Literalmente nada acontece sem erros.)
  2. Avançado Renomeado

    • É possível importar meu arquivo de carregamento, mas ele usa apenas os nomes de arquivo da Coluna 2. Não move os arquivos para as pastas.
  3. Dos Batch usando mover ou copiar

    • Os arquivos existentes são sobrescritos, as mensagens de erro para caminhos longos / nomes de arquivos não são descritivos, não há correção de erros para nomes de arquivos duplicados.

    • My batch copy

      • COPY /Y "C:\Dir1\File001.txt" "Q:\Dir02\Dir03\Dir04\NewFile001.txt"

Quaisquer outras sugestões ou métodos que funcionem e sejam suficientes para todas as minhas necessidades, se possível, seriam muito apreciados, pois tudo o que tentei ficou aquém do resultado esperado pelas razões especificadas, por isso fiquei curioso se alguém no SuperUser pode me ajudar com essa tarefa.

    
por Michael Shnitzer 13.10.2017 / 15:43

1 resposta

1

Usando alguma lógica FOR / F simples e definindo os delimitadores e os tokens de acordo, você pode analisar cada linha do arquivo csv e use cada valor separado por vírgulas como uma variável para processar de acordo com cada iteração de loop.

Com alguma lógica IF condicional simples, você pode controlar quais comandos executar com base em cada condição, sendo TRUE ou FALSE mas é aqui que ele pode verificar se os arquivos já existem ou não e tomar as medidas necessárias.

Usando o comando XCOPY com um canalizado ECHO F informa que cada parâmetro passado para ele é um arquivo e não um diretório, e se algum diretório não existir em qualquer lugar ao longo do caminho onde o arquivo é copiado (por exemplo, coluna 2), todos serão criados durante a operação de cópia de arquivos.

Se o arquivo de destino já existir e você desejar anexar um sufixo exclusivo a cada nome de arquivo copiado que tenha um nome de arquivo correspondente no diretório de destino, use CALL passando cada variável de loop FOR / F como um argumento para uma rotina .

Você pode usar substituições para analisar diferentes partes das variáveis CALL transmitidas para reconstruir e acrescente a string única como um sufixo a qualquer arquivo de destino existente.

Essentially this will. . .

  1. Use the comma as a delimiter with the FOR /F loop and get each value from the csv file separated by each delimiter to use individually for further processing
  2. If the source file from column 1 does not exist, quit and then process the next csv line
  3. If the destination file from column 2 does exist, call a routine and pass the two csv file line values to that routine as variables to expand and process further

    • This routine will create a unique string using date time <YYYYMMDD_hhmmsstt> and ensure this is appended to the destination file name that is copied over ensuring the existing file is not overwritten by the copy operation
  4. If both the destination file does not exist and the source file does exist, it'll simply copy over the file from the source to the destination

  5. If none of these conditions are TRUE, then it does nothing with the iterated csv file values from those lines.

Script em lote

@ECHO ON

SET csvfile=C:\Users\User\Desktop\test.csv

FOR /F "USEBACKQ TOKENS=1,2 DELIMS=," %%a in ("%csvfile%") DO ( 
    IF NOT EXIST "%%~a" GOTO :EOF
    IF EXIST "%%~b" CALL :DupeRoutine "%%~a" "%%~b"
    IF NOT EXIST "%%~b" IF EXIST "%%~a" ECHO F | XCOPY /Y /F "%%~a" "%%~b"
)
GOTO :EOF

:DupeRoutine
::: --Use this with system DATE format "Fri 10/13/2017"
::SET tstamp=%date:~10%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
::: Use this with system DATE format "2017-10-13"
SET tstamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
SET tstamp=%tstamp: =0%

ECHO F | XCOPY /Y /F "%~dpnx1" "%~dp2%tstamp%%~n2%~x2" 
GOTO :EOF

Observação: Se você deseja excluir os arquivos de origem depois que o arquivo for copiado para o destino, faça alguns pequenos ajustes com este script de lote de exemplo usando mais lógica condicional, como && DEL /Q /F <sourcefile> acrescentado aos comandos aplicáveis onde as operações de cópia são concluídas.

Mais recursos

  • FOR / F
  • SE
  • CALL

    HELP CALL
    
    Substitution of batch parameters (%n) has been enhanced.  You can
    now use the following optional syntax:
    
        %~1         - expands %1 removing any surrounding quotes (")
        %~d1        - expands %1 to a drive letter only
        %~p1        - expands %1 to a path only
        %~n1        - expands %1 to a file name only
        %~x1        - expands %1 to a file extension only
    
  • XCOPY

por 13.10.2017 / 23:37