programování .bat souboru

Vážení, je to už strašně dávno, kdy jsem naposledy něco bastlil pomocí .bat souboru. Třeba by mi proto mohl někdo zkušenější poradit…

Potřebuji .bat soubor, který

  1. se přepne do dané složky (složka je daná napevno a nemění se)
  2. najde v té složce soubor, který má nejstarší datum poslední změny
  3. smaže bez ptaní tento soubor

Díky předem za rady!

No, jestli to má být pro Windows NT/2000/XP… tak by mohlo fungovat něco takového:


cd [i]složka[/i]
for /F "tokens=*" %%i in ('dir /o-d /b') do set lastfn=%%i
del %lastfn%


Ale pozor na to "bez ptaní", pokud by ta složka neexistovala…za případně smazané jiné soubory neručím :smiley:

edit: oprava na soubory s názvy s mezerami

Díky! A ještě dotaz - kdyby ten .bat byl uložen ve stejné složce, tak se nemusí nikam přepínat? Jinak řečeno, je akutuální složka defaultně ta, z níž ten .bat spouštím? V tom případě by ale mohlo hrozit, že ten soubor smaže sám sebe - nebo to je nějak zapovězeno?

Ano.

Tím bych si nebyl tak 100% jistý. Třeba ve starších Win se to dalo ovlivnit .pif souborem. Vyzkoušet…

To by se asi stát mohlo. Nedá se omezit seznam mazatelných souborů třeba podle přípony? A upravit např. na


'dir *.log /o-d /b'

A nebo dát tomu .bat naprosto fake datum. Postup např. změním datum v počítači na 2050, edituji bat, změním zpět. Je to ohavný hack (ale ten geniální for cyklus taky :slight_smile: )

pokud je cesta daná napevno, nevidím důvod, proč by se měl měnit adresář. Použiju tu cestu v příkazech a nemusím se bát, že mi někdo smaže ten baťák…

když bude ten baťák spuštěný tak se nesmaže, ale operace skončí hláškou o odepření přístupu k souboru …

Nene, smaže se :slight_smile: Teď jsem to vyzkoušel (xp).

OK, udělal bych to tak, že do své složky udělám další složku a v ní bude bat. Tím bude zajištěno, že existuje ta nadřazená složka a že tedy bat má kde mazat ty soubory a nemůže tudíž smazat nic jiného.

Zápisu


cd složka
for /F "tokens=*" %%i in ('dir /o-d /b') do set lastfn=%%i
del %lastfn%

z výjimkou prvého řádku a prvního slova příkazu v posledním řádku nerozumím. Pokud bych tedy chtěl omezit smazané soubory na ty s určitou příponou (třeba .pri), jak to udělat?

Díky všem!


cd složka
for /F "tokens=*" %%i in ('dir *.pri /o-d /b') do set lastfn=%%i
del %lastfn%

Zdá se, že mazání nefunguje, pokud název souboru obsahuje mezeru! Co s tím?

Soubor to správně identifikuje - nechal jsem si ho vypsat příkazem


echo %lastfn% > "log.txt"

takže je jasné, že je problém v samotném mazání…

a co tohle:


cd složka
for /F "tokens=*" %%i in ('dir *.pri /o-d /b') do set lastfn=%%i
del "%lastfn%"

To je ono! Díky!

Pre istotu doplnam text, ze viem, ze autor chcel bat subor a ten ktory tu je uz uvedeny je perfektny a nijaku mu nemienim "konkurovat" ale dovolujem si upozornit aj na inu moznost riesenia zadania…
Co tak to riesit cez wsh - Windows Script Host
Pokusil som sa zosmolit skript ktory z definovaneho adresara najde najnovsi a potom ho zmaze
Tento text cez notepad ulozit ako ZmazPosledny.js a potom spustit



// JavaScript Document
/* Create the FileSystemObject */
fso = new ActiveXObject("Scripting.FileSystemObject");
/* Tu je adresar z ktoreho chceme zmazat subor */
fsofolder = fso.GetFolder("C:\\temp");
/* Nacitaj zoznam suborov*/
colFiles  = fsofolder.Files;
/* Deklaracia enumeratora */
fc = new Enumerator( colFiles );
/* Pomocna premena pre zoznam suborov  */
var msg = "";
var Lastfile="";
var Lastdate="";
/* Cyklus pre vsetky subory - hladanie najnovsieho */
for (; !fc.atEnd(); fc.moveNext() )
{ 
/*Tu si mozes odfiltrovat podla typu suboru alebo to nedat vobec - vtedy bude hladat medzi vsetkymi subormi*/  
 if (fc.item().Name.indexOf(".htm",0)>-1)
 {
  var f = fso.GetFile( fc.item()) ;
  if (f.DateLastModified >Lastdate) 
  {
   Lastfile=fc.item();
   Lastdate=f.DateCreated;
  }
  msg += fc.item() +"\n";
 }
}
/* Ukaz vsetky subory z adresara */
//WScript.Echo( msg );
/*Zobraz meno suboru, ktory bude zmazany*/
WScript.Echo( Lastfile );
//if (Lastfile>"")
//fso.DeleteFile( Lastfile );


Teraz tam je nastaveny adresar
c:\temp
bude hladat iba subory typu *.html
Zatial ho iba ukaze…
Az odkomentovanim poslednych dvoch riadkov to bude naozaj mazat