我目前正在编写一个 Windows 批处理文件,它需要检查是否存在具有当前计算机名称的文件夹。如果不存在,它会写入具有名称的文件夹,但如果已经存在,它会在末尾附加一个数字,这样最后我就会得到一个包含如下文件夹名称的文件夹
G:\logs\computer-1
G:\logs\computer-2
G:\logs\computer-3
G:\logs\...
到目前为止,我尝试使用这段代码
set usb=G:
SET logdir="%usb%\logs\%computername%"
FOR /L %%F IN (1,1,25) DO (
IF NOT EXIST "%usb%\logs\%computername%-%%F" (
md "%usb%\logs\%computername%-%%F"
SET logdir=%usb%\logs\%computername%-%%F)
goto :eof
)
ECHO %logdir%
但我所能做的只是退出循环,这不是我想要做的事。
答案1
setlocal
set dir=G:\logs\%computername%
set n=0
md "%dir%"||call :a %n%
rem rest of your script
exit
rem the a label is set after the exit function to prevent it from
rem running in the actual script when it's not required.
:a
set /a n+=1
md "%dir%-%n%"||goto a
exit /b
该脚本将按照您描述的方式创建编号文件夹。
在批处理中, 的语法为set
。set "foo=bar"
当变量包含语法破坏字符(如 & 或 |)时,必须使用引号。声明变量时,空格不需要使用引号。set foo="bar"
将 foo 设置为"bar"
。
答案2
选项 1 - 一次创建所有文件夹
根据您问题的起始代码,这将生成一个扩展名为(1 到最大限度)如果它在一次调用中不存在:
SET usb=G:
SET logdir="%usb%\logs"
SET max=25
FOR /L %%F IN (1,1,%max%) DO (
IF NOT EXIST "%logdir%\%computername%-%%F" (
md "%logdir%\%computername%-%%F")
)
前任。
选项 2 - 逐步创建文件夹
作为第二种选择,以下解决方案将在每次调用时添加一次增量文件扩展名(基于目录中的文件夹总数)。同样,它会忽略现有文件夹:
SET usb=G:
SET logdir="%usb%\logs"
FOR /f %%A IN ('dir /b /ad %logdir%^|find /c /v "" ') DO SET fcount=%%A
SET /a fcount+=1
IF NOT EXIST "%logdir%\%computername%-%%A" (
MD "%logdir%\%computername%-%fcount%")
前任。
注意事项
第一个解决方案是总是制作文件夹 1 至最大限度。
第二种解决方案的缺点是它使用目录中的文件夹总数。因此,虽然它会生成具有数字扩展名的类似名称的文件夹,但真正的无间隙有序序列(即 -1、-2、-3、-4...)需要:
- 目录中的所有文件夹名称都需要相同。
- 任何其他文件夹(例如手动添加的文件夹)都保留此顺序(即如果计算机-6存在,则下一个手动添加的文件夹必须是计算机-7)。