如何为Windows脚本创build唯一的输出文件名?

我正在尝试创build一个Windows脚本,每次运行它时都应该生成这种types的文件名:filename1,filename2,filename3等等。 这是我到目前为止:

( @echo off wmic logicaldisk get size,freespace,caption ) > disk.txt 

我希望你能帮助我。 谢谢!!

 :: make a tempfile :maketemp SET "tempfile=%temp%\%random%" IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a") 

您现在有任何数量的文件名可用。

%tempfile%a存在且为空,但%tempfile%anythingelse应可用。


 @ECHO OFF SETLOCAL SET "basename=filename" SET /a outname=0 :genloop SET /a outname+=1 IF EXIST "%basename% %outname%.txt" GOTO genloop SET "outname=%basename% %outname%.txt" ECHO %outname% GOTO :EOF 

啊 – 每次运行时增加目标文件名。 这应该做到这一点。 这实际上并不是创建一个文件 – 你需要创建文件%outname%每次增加它…

%basename%%outname%之间的空格是可选的,当然如果需要的话省略)。


编辑以包含.txt

这会给你多达1000个文件名,但你可以更高,高达20亿,但越高,延迟时间越长,它会选择一个文件名。

 @echo off for /L %%a in (1,1,1000) do if not defined filename if not exist "filename%%a.txt" set "filename=filename%%a.txt" ( wmic logicaldisk get size,freespace,caption ) > "%filename%" 
 @echo off setlocal enableextensions call :getNextFilename "filename*.txt" nextFilename echo %nextFilename% echo test > "%nextFilename%" call :getNextFilename "%cd%\filename*.txt" nextFilename echo %nextFilename% echo test > "%nextFilename%" endlocal exit /b :getNextFilename whatToSearch returnVariable setlocal enableextensions enabledelayedexpansion for /f %%a in ("$\%~1" ) do for /f "tokens=1,* delims=*" %%b in ("%%~nxa" ) do ( set "left=%%b" & set "right=%%c" ) set "max=0" for %%a in ("%~1" ) do for /f "tokens=1 delims=%left%%right% " %%b in ("%%~nxa" ) do for /f "tokens=* delims=0 " %%c in ("0%%~b" ) do if %%~c geq !max! set /a "max=%%c+1" endlocal & set "%~2=%~dp1%left%%max%%right%" & exit /b 

这应该依次找到下一个文件,而不依赖于文件编号中是否存在空洞。 路径可以包含或省略。 *将被用作计算的占位符。 但是如果文件或包含路径有“有问题”的字符,这将不起作用。

如果可以考虑创建文件的日期/时间,那么这个版本可以优化为

 :getNextFilename whatToSearch returnVariable setlocal enableextensions disabledelayedexpansion for /f %%a in ("$\%~1" ) do for /f "tokens=1,* delims=*?" %%b in ("%%~nxa" ) do ( set "left=%%b" & set "right=%%c" ) set "max=0" for /f "delims=" %%a in ('dir /tc /od /b "%~1" 2^>nul' ) do for /f "tokens=1 delims=%left%%right% " %%b in ("%%~nxa" ) do for /f "tokens=* delims=0 " %%c in ("0%%~b" ) do set /a "max=%%c+1" & goto done :done endlocal & set "%~2=%~dp1%left%%max%%right%" & exit /b 

将采用最新创建的文件集实例。

我终于想出了将.txt扩展名的位置。 这是从@ Magoo的答案,但我希望该文件是一个文本文件,所以我把两个.txt文件,以使其正常工作。

 @ECHO OFF SETLOCAL SET "basename=DISK-OUT" SET /a outname=0 :genloop SET /a outname+=1 IF EXIST "%basename% %outname%.txt" GOTO genloop SET "outname=%basename% %outname%.txt" ( wmic logicaldisk get size,freespace,caption ) > "%outname%" GOTO :EOF