|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Определение и работа с некорректными именами файлов |
|
|
CMD/BAT - Определение и работа с некорректными именами файлов
|
Новый участник Сообщения: 6 |
Профиль | Отправить PM | Цитировать
CMD очень не любит имена файлов со всякими !, скобками и прочими символами. Но если попадаются такие - хотелось бы их если не обрабатывать, то хотя бы сообщать скрипту об этом. По конкретике:
for /R %%a in (.) do (set TKatD="%%a"&if "%%a"==!TKatD! (call :ObrabKat)) exit /b :ObrabKat echo %TKatD% set TKat=%TKatD% exit /b C:\Users\1\Temp\MS-DOS_Flash>(set TKatD="C:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\." & if "C:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\." == !TKatD! (call :ObrabKat ) ) C:\Users\1\Temp\MS-DOS_Flash>echo "C:\Users\1\Temp\MS-DOS_Flash\\." "C:\Users\1\Temp\MS-DOS_Flash\\." C:\Users\1\Temp\MS-DOS_Flash>set TKat="C:\Users\1\Temp\MS-DOS_Flash\\." Далее мне надо войти в данный каталог и уже в нём прошустрить файлы. И, само собой, команда не обрабатывается корректно. Тут попытался выйти из положения втавив туда, где имя каталога ещё полное - (cd %%a) - трассировка пишет, что подставляется в строку вроде то, но нет, не срабатывает такой фокус, не заходит. P.S. Уже на моменте написания я нашёл частичное решение - сравнение нашей переменной и текущего каталога - в этом случае хотя бы пропускается косячные. Но всё равно общий вопрос - почему так происходит остаётся открытым. |
|
Отправлено: 15:25, 17-11-2021 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата ChimMAG:
(set TKatD="%%a"&if "%%a"==!TKatD! (call :ObrabKat)) меня угнетает, я её не понимаю. Как возможный приём (не решение, только как пример): @Echo Off cls Set "TKatD=!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!" For /R %%d In (.) Do Echo %%d |>nul 2>&1 FindStr /I "\%TKatD%\" &&Call :ObrabKat "%%d" Pause Exit /B :ObrabKat Echo %1 Dir %1 /s /b /A:-D Exit /B |
|
------- Последний раз редактировалось megaloman, 17-11-2021 в 17:10. Отправлено: 16:24, 17-11-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
С EnableDelayedExpansion - наверное действительно в данном конкретном случае поможет, завтра поэсперементирую. А как быть в случае наличия в имени файла скобки ( ? Скрипт не завершится с ошибкой? |
|
Отправлено: 17:21, 17-11-2021 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать ChimMAG, лучше вообще не использовать языки подобные CMD и PowerShell, если есть сложная обработка имён.
|
Отправлено: 17:40, 17-11-2021 | #4 |
Забанен Сообщения: 346
|
можно так(только в цикле учитывать что появится доп."слэш" в конце и убирать его): у мя выводит вроде ↓ for /R %a in (\) do (echo %a ) (echo C:\Activators\\ ) C:\Activators\\ (echo C:\Activators\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\\ ) C:\Activators\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\\ (echo C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\\ ) C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\\ (echo C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\readme\\ ) C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\readme\\ (echo C:\Activators\kmsauto-office\\ ) C:\Activators\kmsauto-office\\ |
|
Отправлено: 17:46, 17-11-2021 | #5 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Цитата wasp14:
Цитата Iska:
|
||
Отправлено: 04:56, 18-11-2021 | #6 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать В Powershell есть параметр -LiteralPath, помогает в таких случаях.
|
------- Отправлено: 09:54, 18-11-2021 | #7 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать ChimMAG, В вашем примере переменная %X% внутри цикла, хоть Вы ее хотите использовать в процедуре. Поэтому, если аккуратно, то вот так разными способами и ничего не обрезается и не ломается.
@Echo Off cls Set "BoxIn=Z:\Users" For /R "%BoxIn%" %%a In (.) Do ( Echo ===== Echo 00000 %%a Set "X=%%a" Call Echo 11111 %%X%% Call :Obrab "%%a" "%%X%%" Call Set "Y=%%X%%" Call Echo 66666 %%Y%% ) Pause Exit /B :Obrab Echo 33333 %~1 Echo 44444 %~2 Call Echo 55555 %%X%% Exit /B Фрагмент результата у меня.
=====
00000 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. 11111 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. 33333 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. 44444 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. 55555 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. 66666 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Soft_Out\. ===== 00000 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. 11111 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. 33333 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. 44444 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. 55555 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. 66666 Z:\Users\1\Temp\MS-DOS_Flash\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\Я-Архив\. |
------- Отправлено: 10:28, 18-11-2021 | #8 |
Забанен Сообщения: 346
|
ChimMAG, ну вот же
Скрытый текст
C:\Activators ---------------------------------------------------- =>chcp 65001 Active code page: 65001 C:\Activators ---------------------------------------------------- =>for /R %a in (\) do (set X=%a && call :Obrab ) C:\Activators ---------------------------------------------------- =>(set X=C:\Activators\\ && call :Obrab ) C:\Activators ---------------------------------------------------- =>echo Моя переменная для работы: C:\Activators\\ Моя переменная для работы: C:\Activators\\ C:\Activators ---------------------------------------------------- =>exit /b C:\Activators ---------------------------------------------------- =>(set X=C:\Activators\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\\ && call :Obrab ) C:\Activators ---------------------------------------------------- =>echo Моя переменная для работы: C:\Activators\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\\ Моя переменная для работы: C:\Activators\!!!MS-DOS-ver.5-7 (ms-dos.biz)!!!\\ C:\Activators ---------------------------------------------------- =>exit /b C:\Activators ---------------------------------------------------- =>(set X=C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\\ && call :Obrab ) C:\Activators ---------------------------------------------------- =>echo Моя переменная для работы: C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\\ Моя переменная для работы: C:\Activators\KMSAuto Net 2015 v1.4.2 Portable\\ C:\Activators ---------------------------------------------------- =>exit /b Полностью скрипт: |
Отправлено: 14:42, 18-11-2021 | #9 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Вообще скрипт пробегает по всему дереву, начиная с каталога запуска и считает полную длину файлов вместе с путём и выявляет имена с более 255 символами - с такими файлами бывают проблемы. Я подправил, запустил. Отработал за несколько часов более 300 тыс файлов (по моим прикидкам по тому, что он пробегал; я думал, что гораздо медленнее будет, в реальности скорее всего за 500тыс успел) и отрубился. Добавил вывод в отдельный файл трассировку пробегаемых каталогов и счётчик просмотренного. Посмотрю что из этого получится :-) |
|
Последний раз редактировалось ChimMAG, 18-11-2021 в 16:08. Причина: Указал на чьё отвечал Отправлено: 16:05, 18-11-2021 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Операция с именами файлов | rider42 | Скриптовые языки администрирования Windows | 26 | 08-12-2018 21:20 | |
CMD/BAT - Перемещение файлов в папки с аналогичными именами | londondron | Скриптовые языки администрирования Windows | 12 | 22-03-2017 15:22 | |
CMD/BAT - Создание папок и файлов со с случайными именами. | Kirstem | Скриптовые языки администрирования Windows | 0 | 26-04-2015 20:06 | |
CMD/BAT - работа с 2 текстовыми файлами, именами файлов и всё в цикле | Тишина | Скриптовые языки администрирования Windows | 4 | 15-07-2012 20:26 | |
Проблема с русскими именами файлов | iml | Общий по Linux | 7 | 25-09-2006 12:40 |
|