2016-02-21 18 views
1

所以基本上我有这个批处理文件:通过创建一批新的文件,而不会覆盖旧的

@echo off bps -f bps.txt exit

每次我运行该批处理新bps.txt文件覆盖旧的。我想要的是每次运行它时,新文件必须出来,例如, bps1.txt。如果我再次运行它应该出现bps2.txt等。所以例如,如果我运行批次3次,我会有bps.txt,bps1.txt,bps2.txt。

回答

2

这里没有内置功能。使用一个计数器,检查文​​件是否存在,如果不增加计数器,然后再试一次:

set "counter=" 
:SearchFreeFile 
if exist bps%counter%.txt (
    set /a counter+=1 
    goto :SearchFreeFile 
) 
bps -f bps%counter%.txt 
+0

我必须说,这是比我的回答更优雅。 –

0

你可以这样做:

@echo off 
if not exist "bps.txt" (
bps -f bps.txt 
exit 
) 
for /l %%i in (1,1,10000) do (
set "number=%%i" 
if not exist "bps%%i.txt" goto :break 
) 
echo 10000 files with this name already exist 
pause 
exit 
:break 
bps -f bps%number%.txt 
pause 
exit 
1

循环非常耗时。如果你想到的是,文件名是连续创造了你可以做这样的:

for /f %%a in ('dir /b bps*.txt^|find /c /v ""') do set /a next=%%a 
bps -f bps%next%.txt 

for命令这里不是用来循环 - 它只是保存命令的撇号在%%a可变输出。通过dir我们列出了具有该名称模式的现有文件,find命令对它们进行计数。所以如果你已经有2个这个名字的文件,输出将是“2”。

与您的示例不同,第一个文件将被命名为“bps0.txt”,而不是“bps.txt”。如果你想避免这种情况,而使用这样的:

for /f %%a in ('dir /b bps*.txt^|find /c /v ""') do set /a next=%%a 
if %next% EQU 0 (set bps=bps) else (set bps=bps%next%) 
bps -f %bps%.txt 
+0

我也是这么想的。但是,如果某些文件被删除(因为它们是旧的)呢?此解决方案可能会覆盖现有文件中的一个,而不是创建新文件。 (可能会也可能不是问题) – Stephan

+0

它有助于确定最高的文件编号加上一个作为下一个枚举吗?这会留下缺口,但这可能是需要的。 – user1016274

+0

因为文件按字母顺序列出(1.10,11。,19,2,20,21,...),所以很难。替代方法:'dir/od'(最新的文件_应该是数字最高的文件,但在此期间编辑文件时不再这么做)。 – Stephan

0

previous answer采取的第一个“免费”反 - 如果你删除一些“旧”的文件,这将填补国内空白的新文件。

另一种方式(有点不寻常,但有效):使用替代数据流来“保存”计数器。为每个实例添加+1,独立于某些(或全部)以前文件的可能删除(至少在达到Integer的限制之前)。

<%~f0:count set /p count= 
set /a count+=1 
(echo %count%)>%~f0:count 
bps -f bps%count%.txt 

你可以“重启”的计数与(echo 0)>mybatch.bat:count

(注:不检查,如果该文件存在)

相关问题