как зациклить файлы в папке, в которой есть место - PullRequest
0 голосов
/ 30 августа 2018

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

FOR /F %%a in (find_file_list.txt) DO COPY "%%a" "C:\test\%%~nxa"

По сути, в этом файле find_file_list.txt перечислены все файлы с путем

c:\abc\def\12345.txt

c:\abc\def\12346.txt

c:\abc\def\12347.txt

Приведенный выше код копирует все эти три файла в папку test и работает нормально. Теперь, когда find_file_list.txt изменяется, на самом деле в настоящем имени папки есть место, например

c:\ab c\de f\12345.txt

c:\ab c\de f\12346.txt

c:\ab c\de f\12347.txt

вышеуказанный код больше не работает ... есть мысли?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Чтобы вывести каждую непустую строку в файле, вы должны убедиться, что вы указали либо all tokens, либо no delimiters, (в зависимости от вашей задачи вам также может потребоваться предотвратить исключение строк, начинающихся с определенный символ, поведение по умолчанию For состоит в том, чтобы игнорировать все строки, начинающиеся с точки с запятой, ;) .
В этом случае я предпочитаю указать all tokens; это, в отличие от указания разделителей no, удалит все начальные пробелы из каждой строки (это предотвратит захват файлов, содержащих случайные начальные пробелы).

Вы не можете copy файл, который не существует, вы можете подавить любую ошибку при попытке сделать это, используя 2>Nul, но я бы посоветовал проверить, существует ли файл первым.

Когда вы copy файл, вам нужно указать только место назначения, (вам нужно только указать имя файла, если вы его меняете) .

Вместо использования команды Copy вместо команды XCopy можно воспользоваться преимуществом создания каталога назначения, (с учетом прав доступа) , если он еще не существует .

Здесь приведен пример пакетного файла:

@For /F UseBackTokens^=*EOL^= %%A In ("find_file_list.txt") Do @If Exist "%%A" XCopy "%%A" "C:\test\">Nul

… и очень немного измененная версия, запускаемая из командной строки:

For /F UseBackTokens^=*EOL^= %A In ("find_file_list.txt") Do @If Exist "%A" XCopy "%A" "C:\test\">Nul
0 голосов
/ 30 августа 2018

Вы забыли выбрать delims, на который хотите разбить:

FOR /F "delims=" %%a in (find_file_list.txt) DO COPY "%%a" "C:\test\%%~nxa"

Разделителями по умолчанию являются пробелы, если ваш файл содержит их, он будет разделен на пустое пространство. Просто добавьте "delims=", чтобы изменить его на полную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...