PDA

Показать полную графическую версию : Пробелы в именах при перемещении


VladIva
07-12-2014, 17:48
Форумчане, прошу вашей помощи. Требуется переместить список файлов, указанных в list.txt. Проблема в том, что он прекрасно переносит файлы с простыми именами, но как только появляется пробел в имени, он отказывается их видеть. Та же проблема с файлами, у которых в имени есть "нестандартные" символы, типа немецких умляутов или японских иероглифов. Можно ли его сделать "всеядным"?

@echo off
set LIST=list.txt
set TO=C:\Users\test\Desktop\
for /F %%i in (%LIST%) do (
copy /Y "%%i" %TO%
)
pause
exit /B

Вот трейс. Первые два файла с пробелом и арабской вязью в именах. Третий — только латиница без пробелов.

http://forum.oszone.net/attachment.php?attachmentid=119870&stc=1&d=1417964816

Foreigner
07-12-2014, 18:09
for /f "tokens=*" %%i in ....

Georgio
07-12-2014, 18:13
for /f "delims=" %%i in ...

VladIva
07-12-2014, 18:24
Не кушает.


http://forum.oszone.net/attachment.php?attachmentid=119872&stc=1&d=1417965914

Georgio
07-12-2014, 19:07
@echo off

>nul chcp 1251

set "set LIST=C:\Users\user\Desktop\bat_test\list.txt"
set "set TO=C:\Users\user\Desktop\bat_test"

for /f "usebackq delims=" %%i in ("%LIST%") do (

>nul chcp 866

copy /y "%%i" "%TO%"
)

pause
exit /b

VladIva
08-12-2014, 20:01
А можно вместо copy использовать robocopy? У copy я не нашел флаг запрета перезаписи уже имеющихся в папке файлов с такими именами.

Georgio
08-12-2014, 20:20
VladIva, можно, но не нужно, поскольку есть такая конструкция: echo no| copy /-y "%%i" "%TO%".

VladIva
08-12-2014, 22:57
А есть ли возможность сохранить структуру папок при переносе?

Georgio
09-12-2014, 00:27
Возможность есть, а смысла в двойной проверке не вижу. Если Вам нужно применить условие "if exist" для чего-нибудь ещё, кроме копирования файла, то напишите об этом.

VladIva
09-12-2014, 00:44
Понял, лишняя проверка. А есть ли возможность сохранить структуру папок при переносе? Берем файл из C:\App\translit\arabic.cvs и переносим его в Z:\translit\arabic.cvs? На js, air или php я бы не задумываясь написал регулярку, забирающую строку перед последним слэшем, и собрал строку пути, но как это работает в батниках пока не понятно. Возможно, есть какой-то магический флаг, который сохраняет структуру?

Georgio
09-12-2014, 01:20
VladIva, выбирайте из вариантов: xcopy "C:\App\translit\arabic.cvs" "Z:\translit\"; echo d| xcopy "C:\App\translit\arabic.cvs" "Z:\translit"; echo f| xcopy "C:\App\translit\arabic.cvs" "Z:\translit\arabic.cvs".

VladIva
09-12-2014, 01:27
Проблема в том, что папок translit может быть много:
C:\App\translit_ar\arabic.cvs
C:\App\translit_en\text.cvs
C:\App\translit_ru\temp000.txt

Структура на выходе:
Z:\translit_ar\arabic.cvs
Z:\translit_en\text.cvs
Z:\translit_ru\temp000.txt

Georgio
09-12-2014, 02:18
@echo off

set "from=C:\App"
set "to=Z:"

subst #: "%from%"
for /f "delims=" %%i in ('
dir /a-d/b/s #:^| findstr /rc:"^#:\\translit_[^\\][^\\]*\\[^\\][^\\]*$"
') do xcopy /q "%%i" "%to%%%~pi"
subst /d #:

pause>nul
exit /b




© OSzone.net 2001-2012