2012-11-13 9 views
15

Herkes bir toplu iş dosyası oluşturmama yardımcı olabilir mi? Temel olarak, amacım LATEST 7 .txt dosyalarını (diğer bir deyişle, en yeni) klasörde saklayacak ve ardından geri kalanını silecek bir toplu iş dosyası oluşturmaktır. Bu, klasörde 7'den fazla dosya varsa.Bir klasördeki 7 en son dosyayı tutan toplu iş dosyası

Şu anda sahip olduğum sorun, oluşturduğum toplu iş dosyasının, dosyaları bir veya iki aydan beri olduğu için dosyaların çoğunu sildiği gerçeğidir. En son 7 dosyayı, kaç yaşında olursa olsun her zaman saklamak istiyorum.

@echo off 

setlocal enableextensions 

rem ******************************************************************************** 
rem ******************************* LOCAL VARIABLES ****************************** 
rem ******************************************************************************** 

SET TargetDirectory="C:\TEMP\test" 

SET No_of_fles_to_keep=7 

SET count=0 

set cnt=0 

rem ******************************************************************************** 

cd /d %TargetDirectory% 

REM timeout /T 500 

for %%x in (*) do set /a count+=1 

for %%A in (*.bat) do set /a cnt+=1 

cd /d %TargetDirectory% 

REM timeout /T 500 

IF %count% gtr %No_of_fles_to_keep% forfiles -p %TargetDirectory% -s -m "*.txt" -d -%No_of_fles_to_keep% -c "cmd /c del @path" 

echo %count% 

echo File count = %cnt% 

Herhangi bir yardım takdir -

Yani bu ben ne var.

cevap

29

Metin dosyalarını azalan zaman damgası sırasına göre listelemek için DIR'yi /O-D ile kullanabilirsiniz. FOR/F, her dosya üzerinde yineleme yapmanızı sağlar. SET/A, şimdiye kadar kaç dosya listelendiğini takip etmek için kullanılır. Şimdi zor kısım geliyor.

Bir kod bloğu içinde normalde, aynı blokta daha önce ayarlanmış bir değişkenin değeriyle çalışmak için gecikmeli genişletme kullanmanız gerekir. Ancak FORCE değişkeninde ! içeriyorsa ve ! dosya adlarında geçerliyse gecikmeli genişleme for döngüsünde sorunlara neden olabilir. Ben 7. dosya adı okunduğunda 0 ile kasıtlı olarak bölmek için SET/A kullanarak sorun etrafında olsun. Bu, KEEP değişkenini tanımlayan koşullu kodun yürütülmesine neden olan bir hatayı artırır. Bu noktadan sonra kalan tüm dosyalar silinir.

@echo off 
setlocal 
set /a cnt=0 
set "keep=7" 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do (
    if defined keep (
    2>nul set /a "cnt+=1, 1/(keep-cnt)" || set "keep=" 
) else del "%%F" 
) 

Güncelleme

Aman Allahım, ben sadece önemsiz bir çözüm yoktur gerçekleşmiştir. En son değiştirilen tarihe göre sıralandıktan sonra ilk 7 girişi yok saymak için FOR/F SKIP seçeneğini kullanın.

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 

Bir toplu iş dosyasına bile ihtiyacınız yoktur. Komut isteminden çalıştırırsanız, %% değerini % olarak değiştirin.

+0

Sen EĞER komuta "else" bölümünü cevapsız: ') else (del "%% F")' ... – Aacini

+0

@Aacini - Ve yaptım , Teşekkürler. Hepsi sabit. – dbenham

+0

Çok teşekkür ederim!Sadece bunu test ettim ve majik gibi çalıştı. – Knowledge42

2

Toplu dosya aşağıda daha basit bir yaklaşım kullanır. Bu Bu 7 son .txt dosyalarını tutmak ve tüm kaldıracak

@echo off 
for /f "tokens=1* delims=:" %%a in ('dir /b /o-d *.txt ^| findstr /N "^"') do (
    if %%a gtr 7 del "%%b" 
) 

... Antonio

+0

+1, Cevabınız beni daha da basit bir çözümün yeniden değerlendirmesini ve gerçekleştirmesini zorladı. FOR/F SKIP seçeneğini kullanın - revize edilmiş cevabım :-) – dbenham

0

ilk yedi dosyaları tutmak ve geri kalanı silin sonra sadece her sayı karşılaştırmak, her dosyayı numaraya findstr /N "^" komutunu kullanın diğer .txt dosyaları

dosyaları komut istemine On

silmek istediğiniz aynı dizinde komuta altında Yürütme

toplu komut İçinde
for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F" 

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F" 
+0

'u [en iyisinden kopyalayarak] bile (https://stackoverflow.com/a/13368077/2152082) birlikte bkz. – Stephan