2

Я ищу метод на основе Windows/Dos для переименования и копирования / перемещения файлов на основе содержимого файла импорта CSV.

Например:

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"

Что мне нужно

В идеале метод должен принимать вышеприведенное в качестве входных данных и копировать / перемещать файлы из столбца 1 в столбец 2 при создании любых необходимых каталогов.

Я также ищу некоторую обработку ошибок, такую как

  • Не могу создать каталог / папку (по какой-либо причине)
  • Файл уже существует - либо в месте назначения, либо потому, что ввод переименования помещает два файла с одинаковым именем в один и тот же каталог.
  • Есть способ справиться с коллизиями (добавить суффикс и т.д.).

Что я пробовал

До сих пор я пробовал следующие приложения, но не смог заставить их работать так, как мне нужно, поэтому хотел посмотреть, есть ли другой метод, а не программное обеспечение, которое будет выполнять такие операции с Windows:

  1. Bulk Rename Utility

    • Пытался использовать функцию "Импорт пар", но не дал результатов. (Буквально ничего не происходит без ошибок.)
  2. Расширенный Переименован

    • Можно импортировать мой файл загрузки, но он использует только имена файлов из столбца 2. Не перемещает файлы в папки.
  3. Dos Batch с помощью перемещения или копирования

    • Существующие файлы перезаписываются, сообщения об ошибках для длинных путей / имен файлов не являются описательными, исправление ошибок для повторяющихся имен файлов невозможно.

    • Моя пакетная копия

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

Будем весьма благодарны за любые другие предложения или методы, которые будут работать и для всех моих потребностей по возможности, так как все, что я пробовал, не соответствует ожидаемому результату по указанным причинам, поэтому мне было любопытно, может ли кто-нибудь из SuperUser помочь мне с этой задачей ,

1 ответ1

1

Используя простую логику FOR /F и, соответственно, устанавливая разделители и токены, вы можете анализировать каждую строку файла CSV и использовать каждое значение, разделенное запятыми, в качестве переменной для соответствующей обработки для каждой итерации цикла.

С помощью некоторой простой условной логики IF вы можете контролировать, какие команды запускать на основе каждого условия, ИСТИНА или ЛОЖЬ, но здесь можно проверить, существуют ли файлы или нет, и принять соответствующие меры.

Использование команды XCOPY с переданным по каналу ECHO F говорит ему, что каждый передаваемый ему параметр является файлом, а не каталогом, и, если какой-либо каталог не существует нигде вдоль пути, куда копируется файл (например, столбец 2), все будут быть создан во время операции копирования файла.

Если файл назначения уже существует, и вы хотите добавить уникальный суффикс к каждому скопированному имени файла, имеющему соответствующее имя файла в каталоге назначения, вы можете использовать простую логику CALL, передавая каждую переменную цикла FOR /F в качестве аргумента для подпрограммы.

Вы можете использовать подстановки для анализа различных частей переданных переменных CALL, чтобы восстановить и добавить уникальную строку в качестве суффикса к любым существующим файлам назначения.


По сути это будет. , ,

  1. Используйте запятую в качестве разделителя в цикле FOR /F и получите каждое значение из файла csv, разделенного каждым разделителем, для отдельного использования для дальнейшей обработки
  2. Если исходный файл из столбца 1 не существует, выйдите и обработайте следующую строку CSV
  3. Если целевой файл из столбца 2 существует, вызовите подпрограмму и передайте в нее две значения строки файла csv в качестве переменных для расширения и дальнейшей обработки.

    • Эта подпрограмма создаст уникальную строку с использованием даты и времени <YYYYMMDD_hhmmsstt> и убедится, что она добавляется к имени файла назначения, который копируется, и гарантирует, что существующий файл не будет перезаписан операцией копирования
  4. Если файл назначения не существует, а исходный файл существует, он просто скопирует файл из источника в место назначения

  5. Если ни одно из этих условий не является ИСТИНОЙ, то оно ничего не делает с повторяющимися значениями файла CSV из этих строк.


Пакетный скрипт

@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

Примечание. Если вы хотите удалить исходные файлы после того, как файл скопирован в место назначения, вы можете внести некоторые небольшие изменения в этот пример пакетного сценария, используя дополнительную условную логику, например && DEL /Q /F <sourcefile> добавляемую к применимым командам, где Операции копирования завершены.


Дополнительные ресурсы

  • FOR /F
  • ЕСЛИ
  • ВЫЗОВ

    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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .