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.