пятница, 21 июля 2023 г.

CMD имя папки дата

По работе опять столкнулся с необходимостью работать с батниками для автоматизации, и появилась задача найти как в папке по конкретному пути вывести список файлов (это для начала) и уже на этом этапе возникли некоторые трудности. Поиск в яндексе предложил несколько вариантов, и испробовав часть из них я в принципе нашел что мне требовалось. Дело в том что формат папки по дате это YYMMDD - то есть сегодня 230721, но папка расположена еще и по пути с русскими буквами. для того чтобы в bat файле отображалась кириллица, то его нужно сохранять в формате OEM 866, удобно в этом случае то что сохранив один раз, и открыв его даже в виндовом блокноте, если не трогать кракозябры, то кодировка не изменится если изменять английские символы и сохранять. И только сейчас я подумал что можно использовать декодеры онлайн, если на компьютере нет например notepad++ чтобы можно было менять кодировки. Соответственно специально для этого случая, я сохраню тут в этой кодировке, чтобы попробовать воспроизвести позже (кракозябрами написано Новая папка):
@echo off
SET folder=test
for /f "tokens=*" %%a in ('PowerShell -Command "& {Get-Date -format "yyMMdd"}"') do set folder=%%a
echo C:\Ќ®ў п Ї ЇЄ \%folder%
cd C:\Ќ®ў п Ї ЇЄ \%folder%
dir /s /b
pause

как видно для задания формата папки используется программа powerShell - что не очень то  и круто. Но другие примеры в том разделе давали еще хуже варианты. Однако позже натолкнулся на конструкцию вида %date:~6,4%_%date:~3,2%_%date:~0,2% и там объяснили в чем прикол этих тильд и номеров: если в кратце, то Если вместо %переменная% взять %переменная:~начало,длина% - получим часть строки. В итоге тот же скрипт выше будет выглядеть чуть интереснее в плане производительности (но не в плане универсальности, потому как вывод стандартной даты может отличаться на разных машинах с учетом настройки локализации и прочего)

@echo off
SET folder=test
set folder=%date:~8,2%%date:~3,2%%date:~0,2%
echo C:\Ќ®ў п Ї ЇЄ \%folder%
cd C:\Ќ®ў п Ї ЇЄ \%folder%
dir /s /b
pause

UPDATE. В общем проверил теорию с кодировкой и выяснилось что копирование осуществляется с ошибкой, вместо буквы А копируется пробел, потому единственный выход в таких ситуациях это использовать специальный блокнот в винде, способный сохранять в кодировке 866, либо гуглить такую задачу отдельно. Кроме того пришел к выводу что конструкция с PowerShell удобнее, т.к. позволяет задействовать время в названии файла, что дает больше возможностей. Следующим постом будет оканчательный вариант скрипта с пояснениями

Комментариев нет:

Отправить комментарий