Разъяснение кода (опять же - все коды примеров сохраняем в файл с расширением .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, чего Вы и домогались.