基本上,我有一个名为“ 9999-0004-PM Access项目创建模板V2”的文件夹 我想复制它并将其重命名为“ 2019-####-项目名称” 其中####是带前导零的数字,项目名称是用户输入名称。 我的代码可以很好地增加####的值,但是说我有:
2019-0015 - project number 1
2019-0016 - some other project
2019-0018 - a different value
2019-0019 - insert name here
当我运行批处理文件时,我最终得到: 2019-0017-重命名此文件夹
我想要将其重命名为: 2019-0020-重命名此文件夹
@echo off
setlocal enableDelayedExpansion
set source="C:\test1\9999-0004 - PM Access Project Creation Template V2"
set destination=C:\test2\
set /P project=please enter name of project:
set "n=0"
set "name=%project%"
set "year=2019"
pushd %destination%
:loop
set Var=0000%n%
set Var=%Var:~-4%
if exist %destination%\2019-%Var%* set /a n+=1 && goto :loop
set final_destination="%destination%2019-%Var% - %name%"
xcopy /s %source% %final_destination%\ /O /X /E /H /K
icacls %final_destination% /grant "MACStaff:(OI)(CI)(W)"
popd
@echo on
答案 0 :(得分:1)
@echo off
setlocal
set "source=u:\sourcedir\t w o"
set "destination=u:\destdir"
SET "project=rename this folder"
set "year=2019"
SET /a var=10000
FOR /f "tokens=2delims=- " %%a IN ('dir /ad /on /b "%destination%\%year%-*" 2^>nul') DO set /a Var=1%%a + 1
set "final_destination=%destination%\%year%-%Var:~1% - %project%"
echo xcopy /s "%source%" "%final_destination%\" /O /X /E /H /K
ECHO icacls "%final_destination%" /grant "MACStaff:(OI)(CI)(W)"
GOTO :EOF
我使用了适合我系统的目录名。
出于测试目的,我还强制输入了新的目录名后缀
使用语法SET "var=value"
(值可以为空)来确保分配的值中不包含任何杂散的尾随空格。
将带引号的字符串分配给变量使变量难以逻辑组合。根据需要插入引号要简单得多。
请注意,此过程不需要delayedexpansion
(似乎您一直没有使用)
所以-原理是使用/b
的掩码按名称顺序读取/ad
目录名的/on
基本模式下的目录列表,按名称顺序是有关年份的所有目录名称。
使用%year%-*
和 Space 的分隔符,结果将是-
依次获取每个序列号(您的格式为yyyy - serial Space 文本,因此第二个令牌包含序列号),因此%%a
会显示找到的最后一个值,并带有var
并添加1。
如果没有匹配的目录名,则1
禁止显示丑陋的错误消息(表示将错误消息发送到2^>nul
设备以处理它们,而插入符号(nul
)告诉^
重定向器是要执行的cmd
命令的一部分,而不是dir
的一部分。for
将保持不变,因此将保留值{{1 }}。
然后构造var
麦加诺风格的咖啡,然后自己煮一杯咖啡。