2016-02-21 39 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

(注:不檢查,如果該文件存在)

相關問題