我已经在我关于这个主题的最后一个问题中尝试了Mofi给出的答案。但是我更改了基本名称,现在似乎没有用。如果您想查看上一个问题:How do I increment a filename in batch?此新代码有什么问题?它不会创建一个新文件,只会覆盖以前生成的文件。
:MainProcessNew
cd /D "%USERPROFILE%\Desktop"
for /F %%G in (*.json) do (
set "FileName=%%G"
set "BaseName=Device"
set "FileNumber=0"
)
:FileNameLoop
set /A FileNumber+=1
if exist "%BaseName%%FileNumber%.json" (
goto FileNameLoop
)
echo.>"%USERPROFILE%\Desktop\%BaseName%%FileNumber%.json"
答案 0 :(得分:2)
我非常确定有问题的批处理代码不完整或简化为不太适合重现问题的脚本代码,因为文件夹Device.json
中存在Desktop
而没有其他{ {1}}文件存在,空行首先写入Device*.json
。名称为Device1.json
的文件永远不会被相关批处理代码覆盖,因为变量Device.json
的值始终至少为FileNumber
。
嗯, FOR 选项1
在这里很可能是错误的,因为我认为 FOR 循环应该搜索* .json文件,而不是{{ 1}}。使用像* .json这样的通配符模式以及选项/F
会导致错误消息:
系统找不到文件* .json。
在命令提示符窗口/F
或/F
中运行,以获取有关此命令语法的帮助。
完全不清楚 FOR 循环的目的是什么,因为根本不使用for /?
变量。如果找到任何* .json文件,则此变量应该包含最后找到的* .json的名称。但如果不在任何地方进一步使用,这也没有意义。
还不清楚为什么help for
和FileName
在循环内而不是在外面定义。
在完整的批处理代码中,标签BaseName
可能是子例程的开头。但在减少的批处理代码中,没有FileNumber
在这种情况下我会期望。
所以问题很难回答,因为不清楚发布的批处理代码究竟是什么问题。
FileNameLoop
提示:用于调试批处理文件
call :FileNameLoop "%%G"
或:MainProcessNew
cd /D "%USERPROFILE%\Desktop"
rem Useless FOR loop without /F commented out.
rem for %%G in (*.json) do set "FileName=%%G"
set "BaseName=Device"
set "FileNumber="
rem Skip searching for files with a file number
rem after Device if there is no Device.json file.
if not exist "%BaseName%.json" goto CreateFile
rem Otherwise keep Device.json as is and search for Device1.json,
rem Device2.json, ... until a Device*.json file with current number
rem is not found and use this number for next Device*.json file.
set "FileNumber=0"
:FileNameLoop
set /A FileNumber+=1
if exist "%BaseName%%FileNumber%.json" goto FileNameLoop
:CreateFile
rem Note: FileNumber is replaced in the line below by an empty
rem string if there is no Device.json in desktop folder.
echo.>"%USERPROFILE%\Desktop\%BaseName%%FileNumber%.json"
,或将@echo off
更改为echo off
,off
并按 RETURN 。现在可以在命令提示符窗口中看到Windows命令处理器在预处理每一行和每个命令块后执行的每一行,这意味着在将所有on
替换为当前值后当前行或整个命令块中的变量。
还可以看到错误消息,因为命令提示符窗口在处理批处理文件停止后仍保持打开状态,除了它包含没有选项"Path to batch file\BachFileName.bat"
的命令%VariableName%
,它始终终止当前命令进程。