Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


epoddubniy, Давайте договариваться: Вы берёте мой код, сохраняете его в текстовый файл с расширением .bat в 866 кодировке и запускаете его на выполнение. Потом по факту рассказываете, что работает, а что брыкается.
Я еще раз проверил исполнение моих кодов - работают.
Разъяснение кода (опять же - все коды примеров сохраняем в файл с расширением .bat и запускаем на выполнение)

Dir /B /A:-D "%BoxIn%\*%Find%" - получаем список имен файлов в целевой директории, у которых имя имеет маску "*_21.xls"
Обсудим поведение переменных в цикле (извините, если излагаю известное).
Для отладки, вот код:
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=Z:\Box_In"
	Set "Find=_21.xls"
	Set "Repl=_2021.xls"

	Set "Name=kuku"
	For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*%Find%"`) Do (
		Set "Name=%%~nxf" 
		Echo %Name%===="%%~nxf"
	)
Echo %Name%
pause
Exit /B
Видим, что с нашей точки зрения переменная %Name% раскрывается неправильно.
Echo %Name%===="%%~nxf" выдаёт значение %Name% определённое до цикла, а после цикла
Echo %Name% выдаст последнее значение, присвоенное %Name% в цикле.
Такие реалии раскрытия переменной в цикле.
Чтобы раскрытие переменной работало корректно, применим вместо
Echo %Name%===="%%~nxf" ------> Call Echo %%Name%%===="%%~nxf"
Проделайте и убедитесь, что работает ожидаемо.
То есть, Name заключили с двух сторон в двойные %% и вызвали команду через Call
Альтернатива
Код: Выделить весь код
@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
	Set "BoxIn=Z:\Box_In"
	Set "Find=_21.xls"
	Set "Repl=_2021.xls"

	For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%BoxIn%\*%Find%"`) Do (
		Set "Name=%%~nxf" 
		Echo !Name!===="%%~nxf"
	)
pause
Exit /B
Но я стараюсь не применять этот способ, так как если в имени присутствуен "!" то код корректно не отработается.

Аналогичная история с Ren. Но тут еще надо почитать хелп к Set /?
Цитата хелп к Set:
Подстановка переменной среды может быть расширена следующим образом:

%PATH:str1=str2%

расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в
расширенном результате на "str2". "str2" может быть пустой строкой для
эффективного удаления вхождений "str1" из расширенного вывода. "str1" может
начинаться со звездочки, и в этом случае это будет соответствовать любому
началу расширенного вывода до первого вхождения оставшейся части "str1".
У нас переменняя Name, мы договорились, что её надо использовать как %%Name%%,
str1 это %Find%, str2 это %Repl%
То есть в имени файла подстроку _21.xls заменим на _2021.xls, чего Вы и домогались.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:15, 16-05-2021 | #7