Windows Script Host – ukázka několika základních operací nad adresáři a soubory
Windows Script Host (WSH) umožňuje psaní scriptů pro Windows. Není to jediné prostředí, ve kterém se vytvářejí skripty pro Windows, ale narozdíl od dalších možností (např. PowerShell), je přímou součástí systémů Windows 98 a vyšších. V tomto článku si ukážeme základní syntax VBScriptu a jeden užitečný trik: převzetí vlastnictví souboru.
WSH
WSH, jak již bylo řečeno, je standardní součástí Windows od verze 98 a výše. Může se ale stát, že bude nejdříve potřeba v systému povolit. Pokud ano, můžete se například držet návodu na stránkách ZDE. V základu WSH umí spustit JScript a VBScript. První jmenovaný je psán pomocí JavaScriptu a druhý je napsán v Microsoft Visual Basic, Scripting Edition. My si dnes ukážeme několik užitečných operací, které by se Vám mohly hodit při psaní vlastního skriptu. Jako skriptovací jazyk jsme si vybrali Visual Basic.
Pozn.: Komentář ve VBScriptu je řetězec umístěný za znakem ‘
např. ‘toto je komentář
Všechny proměnné použité ve skriptu je nejprve potřeba nadefinovat pomocí klíčového slova “Dim”
např. Dim mojePrvniPromenna
Načtení vstupního argumentu ze řádky
Následující část kódu vezme první argument, který se při spuštění skriptu zadal, a uloží ho do proměnné prvniArgument. Podmínka ELSE se provede v našem případě tehdy, pokud žádný arugument nepřijde (script byl spuštěn bez parametru).
Dim args, prvniArgument Set args = WScript.Arguments If WScript.Arguments.Count > 0 Then prvniArgument = args(0) Else ObjOutFile.WriteLine("Nezadan zadny vstupni argument.") wscript.quit ''Ukonci cely skript End If
Pokud očekáváme další argumenty, získáme je podobně jako ten první – druhý tedy bude args(1) atd.
Vytvoření vlastního adresáře
Budeme-li někdy např. potřebovat vytvořit za běhu skriptu adresář, kam budeme odkládat nějaké soubory, můžeme to provést takto:
Dim folderToCreate, fso folderToCreate = "C:\archiv\" Set fso = WScript.CreateObject("Scripting.FileSystemObject") If fso.FolderExists(folderToCreate) = False Then fso.CreateFolder(folderToCreate)
Načítání vstupního souboru
V následující ukázce budeme postupně načítat řádky souboru (počítejme např. s tím, že to jsou názvy adresářů) a ukládat je do struktury Dictionary. Dictionary je struktura podobná Mapě v Javě (ukládají se dvojice klíč a hodnota). Jednoduchá ukázka obsahuje příklad Do Until cyklu (cyklus, který se opakuje dokud je podmínka nesplněna) a bloku IF-ELSE. U příkazu If si musíme dát pozor, protože první příkaz bloku této podmínky musí být na novém řádku (nemůžeme začít příkazy psát do stejné řádky jako klíčové slovo “Then”).
Dim rFile, ForReading, objFSO, objTextFile, oDict, strNextLine rFile = "C:\rFile.txt" ''Soubor, ze ktereho budeme cist Const ForReading = 1 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile(rFile, ForReading) Set oDict = CreateObject("Scripting.Dictionary") ''Vytvoreni Dictionary jmenem oDict oDict.CompareMode = vbBTextCompare ''Metoda razeni klicu Do Until objTextFile.AtEndOfStream ''Cyklus, ktery postupne nacita po radcich souboru C:\rFile.txt strNextLine = objTextFile.Readline ''Do promenne strNextLine priradime cely nacteny radek rFile If oDict.Exists(strNextLine) Then ''Pokud jiz v Dictionary tento zaznam mame, pouze vypiseme varovani wscript.Echo "Zaznam jiz exituje." Else ''Pokud v Dictionary jeste neni, pridame ho. oDict.Add strNextLine, strNextLine ''klic,hodnota - pro nase ucely vyhledavani staci aby byly identicke End If Loop wscript.echo "soubor nacteny"
Procházení systému podadresářů
Nyní si ukážeme jak projít systém podadresářů nějakého adresáře. Do proměnné ObjSubFolders načteme všechny podadresáře, poté je v jednoduchém cyklu projdeme a u každého ověříme, zda je obsažen v Dictionary oDict.
Dim originalFile, fso, ObjFolder, ObjSubFolders originalFile = "C:\dire\" 'Adresar, ktery budeme prochazet Set fso = CreateObject("Scripting.FileSystemObject") Set ObjFolder = fso.GetFolder(originalFile) 'Z adresare, ktery budeme prohledavat ziskame objekt Set ObjSubFolders = ObjFolder.SubFolders 'Do ObjSubFolders ulozime podadresare prohledavaneho adresare For Each ObjSubFolder In ObjSubFolders 'V cyklu projdeme vsechny podadresare If oDict.Exists(objSubFolder.Name) Then 'Pokud takovy zaznam existuje v Dictionary wscript.Echo "Adresar " & objSubFolder.Name & " je obsazen v dictionary" Else wscript.Echo "Adresar "& ObjSubFolder.Name &" neni obsazen v dictionary" End If Next
Kopírování, přesouvání a mazání adresářů
Pokud budeme potřebovat zavolat na nějaký adresář kopírování, přesun nebo mazání, uděláme to takto:
'Kopirovani adresare Dim fsoMv, folder Set fsoMv = CreateObject("Scripting.FileSystemObject") set folder = fsoMv.GetFolder("c:\dire\d1") 'soubor ktery budeme kopirovat folder.Copy "C:\archiv\" ''Kopirovani - cesta znaci kam
'Presun adresare Dim fsoMv, folder Set fsoMv = CreateObject("Scripting.FileSystemObject") set folder = fsoMv.GetFolder("c:\dire\d1") 'soubor se kterym budeme hybat folder.Move "C:\archiv\" 'Presouvani - cesta znaci kam
'Vymazani adresare Dim fsoMv, folder Set fsoMv = CreateObject("Scripting.FileSystemObject") set folder = fsoMv.GetFolder("c:\dire\d1") 'soubor ktery budeme mazat folder.Delete
Převzetí vlastnictví adresářů
Převzetí vlastnictví adresářů se může hodit, pokud chceme přesunout nebo smazat adresář, který náš není. Na tuto operaci pochopitelně potřebujeme administrátorská práva. Následující kód je přímo inspirován touto stránkou: scriptingguy – můžete zde nalézt další informace týkající se přebírání vlastnictví souborů a adresářů.
strComputer = "." Dim objWMIService, colFolders Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colFolders = objWMIService.ExecQuery _ ("Select * From Win32_Directory Where Name = 'C:\\Scripts'") For Each objFolder in colFolders objFolder.TakeOwnershipEx Next
Vlastní ošetření errorů
Pokud budeme chtít, aby skript provedl operaci nad větším počtem souborů nebo adresářů, bude se nám hodit vlastní ošetření errorů. Řekněme například, že potřebujeme převzít vlastnictví u 1000 adresářů a jeden zrovna nebude dostupný. Skript by v takovém případě spadl s chybovou hláškou a u zbytku adresářů už vlastnictví nepřevzal. My místo toho error odchytíme, vypíšeme chybovou hlášku a budeme pokračovat dále ve vykonání skriptu.
On Error Resume Next 'Tady bude nejaky blok prikazu. Napriklad cyklus, ktery nacita adresare a přebira jejich vlastnictvi. For Each ... In ... ... If Err.Number 0 Then 'Tady nadefinujeme co v pripade erroru delat ObjOutFile.WriteLine("nastal error! " &Err.Decsription) Err.Number = 0 'Predevsim pokud mame tuto podminku v cyklu, je potreba promennou Err.Number vynu- 'lovat. Jinak by se volala pri kazdem pruchodu End IF Next Next
Závěr
V článku jsme si na příkladech ukázali, jak napsat jednoduchý skript. Najdete v něm jak základní operace se soubory a adresáři, jako je přesun nebo mazání, tak i složitější, jako je převzetí vlastnictví adresářů. V případě jakýchkoliv dotazů mě neváhejte kontaktovat na info@bcvsolutions.eu.