VBScript kookboek
- Introductie
- Afvangen van foutcodes, en produceren van begrijpelijke meldingen
- Werken met bestanden en mappen
- Werken met processen
- Werken met services
- Werken met het Operating system
- Werken met het register
- Conversies van het ene formaat naar het andere
- Werken met Internet Explorer
- Werken met Excel
- Werken met netwerken
- Werken met tijd
- Werken met strings
- Werken met gebruikers, groepen, rechten
- Diversen
- Links
Introductie
Alle onderstaande scripts zijn getest onder Windows 7.
Afvangen van foutcodes, en produceren van begrijpelijke meldingen
Met gebruikmaking van het Err object
Een subroutine om foutmeldingen te produceren, gebaseerd op zowel een meegegeven
string als informatie in het Err
-object.
Sub DisplayCustomError(strMessage)
'Display custom message and information from VBScript Err object.
strError = VbCrLf & strMessage & VbCrLf & _
"Number (dec) : " & Err.Number & VbCrLf & _
"Number (hex) : &H" & Hex(Err.Number) & VbCrLf & _
"Description : " & Err.Description & VbCrLf & _
"Source : " & Err.Source
Err.Clear
WScript.Echo strError
End Sub
De volgende code bevat een paar fouten.
De service Alerte
bestaat niet, want er mist een 'r'
aan het eind.
De printer FakePrinter
bestaat niet.
Je probeert eerst verbinding te maken met WMI, dan met de service en dan met de printer.
In alle gevallen creëer je eerst een string-variabele met een duidelijke
foutmelding.
En als het misgaat laat je de subroutine
DisplayCustomError
zowel de standaardfoutmeldingen
als die eigen informatie weergeven.
On Error Resume Next
strComputer = "." 'Change to non-existent host to create binding error.
strService = "Alerte"
strPrinter = "FakePrinter"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err = 0 Then
WScript.Echo vbCrLf & "Bind success"
WScript.Echo vbCrLf & "Computer: " & strComputer
Else
strMessage = "ERROR: Unable to bind to WMI provider on " & strComputer & "."
DisplayCustomError(strMessage)
WScript.Quit
End If
Set objService = objWMIService.Get("Win32_Service.Name='" & strService & "'")
If Err = 0 Then
WScript.Echo vbCrLf & "Service success"
WScript.Echo "Service Name" & objService.Name
WScript.Echo "Service State" & objService.State
Else
strMessage = "ERROR: Unable to retrieve state of " & strService & " service."
DisplayCustomError(strMessage)
End If
Set objPrinter = objWMIService.Get("Win32_Printer.Name='" & strPrinter & "'")
If Err = 0 Then
WScript.Echo vbCrLf & "Printer success"
WScript.Echo "Printer Name: " & objPrinter.Name
WScript.Echo "Printer State: " & objPrinter.PrinterStatus
Else
strMessage = "ERROR: Unable to retrieve state of " & strPrinter & " printer."
DisplayCustomError(strMessage)
End If
Weergeven van extra WMI-foutinformatie
Onderstaande subroutine lijkt op die waarbij je alleen
gebruik maakt van het Err
-object
:
Sub DisplayWMIError(strMessage)
strError = VbCrLf & strMessage & _
VbCrLf & "Number (dec) : " & Err.Number & _
VbCrLf & "Number (hex) : &H" & Hex(Err.Number) & _
VbCrLf & "Description : " & Err.Description & _
VbCrLf & "Source : " & Err.Source
'Instantiate SWbemLastError object.
Set WMI_Error = CreateObject("WbemScripting.SWbemLastError")
strError = strError & VbCrLf & "Operation : " & WMI_Error.Operation & _
VbCrLf & "ParameterInfo: " & WMI_Error.ParameterInfo & _
VbCrLf & "ProviderName : " & WMI_Error.ProviderName
WScript.Echo strError
Err.Clear
End Sub
In onderstaande code maak je WMI-fouten m.b.t. een printer, een proces en een service:
On Error Resume Next
strComputer = "." 'Change to non-existent host to create binding error.
strService = "Alerte"
strPrinter = "FakePrinter"
strProcessHandle = "3280"
'Bind to WMI on specified computer.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err = 0 Then
WScript.Echo vbCrLf & "Bind success"
WScript.Echo vbCrLf & "Computer: " & strComputer
Else
WScript.Echo "ERROR: Unable to bind to WMI provider on " & strComputer & "."
WScript.Quit
End If
'Try to connect to specified printer.
Set objPrinter = objWMIService.Get("Win32_Printer.Name='" & strPrinter & "'")
If Err = 0 Then
WScript.Echo vbCrLf & "Printer success"
WScript.Echo "Printer Name: " & objPrinter.Name
WScript.Echo "Printer State: " & objPrinter.PrinterStatus
Else
DisplayWMIError("ERROR: Unable to retrieve state of " & strPrinter & _
" printer.")
End If
'Try to instantiate specified process.
Set objProcess = objWMIService.Get("Win32_Process.Handle='" & _
strProcessHandle & "'")
If Err = 0 Then
WScript.Echo vbCrLf & "Process success"
WScript.Echo "Process Name: " & objProcess.Name
WScript.Echo "Process ID: " & objProcess.ProcessId
WScript.Echo "Process Command Line: " & objProcess.CommandLine
Else
DisplayWMIError("ERROR: Unable to retrieve state of process " & _
strProcessHandle & ".")
End If
'Try to instantiate specified service.
Set objService = objWMIService.Get("Win32_Service.Name='" & strService & "'")
If Err = 0 Then
WScript.Echo vbCrLf & "Service success"
WScript.Echo "Service Name" & objService.Name
WScript.Echo "Service State" & objService.State
Else
DisplayWMIError("ERROR: Unable to retrieve state of " & strService & _
" service.")
End If
De uitvoer ziet er dan als volgt uit:
Bind success
Computer: .
ERROR: Unable to retrieve state of FakePrinter printer.
Number (dec) : -2147217350
Number (hex) : &H8004103A
Description : Invalid object path
Source : SWbemServicesEx
Operation : GetObject
ParameterInfo: Win32_Printer.Name='FakePrinter'
ProviderName : WinMgmt
ERROR: Unable to retrieve state of process 3280.
Number (dec) : -2147217406
Number (hex) : &H80041002
Description : Not found
Source : SWbemServicesEx
Operation : GetObject
ParameterInfo: Win32_Process.Handle="3280"
ProviderName : CIMWin32
ERROR: Unable to retrieve state of Alerte service.
Number (dec) : -2147217406
Number (hex) : &H80041002
Description : Not found
Source : SWbemServicesEx
Operation : GetObject
ParameterInfo: Win32_TerminalService.Name="Alerte"
ProviderName : Win32_WIN32_TERMINALSERVICE_Prov
Werken met bestanden en mappen
Op dit moment de volgende scripts:
- Controleren of bestanden of mappen bestaan
- Copiëren van een bestand naar een ander bestand
- Haal alle bestanden in een map op
- Gooi bepaalde bestanden op de PC weg die ouder zijn dan bepaalde datum
- Een tekstbestand van achteren naar voren verwerken
Controleren of bestanden of mappen bestaan
Met het volgende script controleer je of het bestand
C:\scripts\test.txt
bestaat, en de of de map
waar het in zou moeten zitten bestaat:
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists("C:\scripts") Then
If objFSO.FileExists("C:\scripts\test.txt") Then
Wscript.Echo "Folder and file exist"
Else
Wscript.Echo "Folder exists, file doesn't"
End If
Else
Wscript.Echo "Folder does not exist"
End If
Copiëren van een bestand naar een ander bestand
Het volgende script doet dat (waarbij het bestand dezelfde naam houdt):
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")
objFile.Copy "C:\scripts\temp\"
In de Copy
method geef je de map op waar het bestand
heen moet, en dus moet er een backslash aan het eind.
Haal alle bestanden in een map op
Het volgende script haalt alle bestanden (niet mappen!) in
C:\Temp
op en drukt ze af.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Temp'} Where " _
& "ResultClass = CIM_DataFile")
For Each objFile In colFileList
Wscript.Echo objFile.Name
Next
Gooi bepaalde bestanden op de PC weg die ouder zijn dan bepaalde datum
Het volgende script gooit alle bestanden op de computer weg die ouder zijn
dan 2 november 2003, en extensie WXY
hebben.
De kans is groot dat er niet zulke oude bestanden met zo'n rare extensie zijn, maar voor de zekerheid heb ik de regel van het weggooien uitgecommentarieerd door er een ' voor te zetten.
strDate = "20031102000000.000000+000"
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where CreationDate < '" & strDate & "'" & _
" AND Extension = 'wxy'")
For Each objFile in colFiles
Wscript.Echo objFile.Name
' objFile.Delete
Next
Je zou CreationDate
ook kunnen vervangen door bv.
LastModified
, waarna het script werkt met de datum
waarop bestanden het laatst gewijzigd zijn.
Op de site van Microsoft uitgebreide uitleg over dit script (in het Engels).
Een tekstbestand van achteren naar voren verwerken
De basisoplossing is niet zo moeilijk. Een bestand kan je niet van achteren naar voren lezen, maar een array wel. Lees dus het bestand, sla het op in een array, en lees die dan van voren naar achteren.
Toen ik probeerde zelf een oplossing te bedenken liep ik tegen het volgende
probleem aan: je weet van tevoren niet hoe groot het bestand is.
Maar je moet wel met een DIM
-commando, of met een
REDIM
commando (als je het pas later weet) aangeven hoe
groot de array moet zijn.
En je kan niet eerst de array vullen, en als je eenmaal weet hoeveel regels
er in het bestand zaten, de REDIM
doen.
Het volgende script werkt voor tekstbestanden met minder dan 100 regels:
strFileName="Numbers.txt"
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
i=0
Dim arrLines(100)
Do Until objFile.AtEndOfStream
arrLines(i) = objFile.ReadLine
i = i+1
Loop
objFile.Close
i = i-1
For j = i to 0 Step -1
Wscript.Echo arrLines(j)
Next
Wil je het probleem echt oplossen, dan moet je de REDIM
gewoon binnen de loop doen.
Je vergroot dus bij iedere regel de array met 1 element:
Do Until objFile.AtEndOfStream
Redim Preserve arrLines(i)
arrLines(i) = objFile.ReadLine
i = i + 1
Loop
Werken met processen
Een proces starten (met 1 eigenschap)
Het starten van kladblok (notepad)
in een normaal
venster op de lokale computer:
Const NORMAL_WINDOW = 1
strComputer = "."
strCommand = "notepad.exe"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = NORMAL_WINDOW
Set objProcess = objWMIService.Get("Win32_Process")
intReturn = objProcess.Create _
(strCommand, Null, objConfig, intProcessID)
If intReturn = 0 Then
Wscript.Echo "Process Created." & _
vbCrLf & "Command line: " & strCommand & _
vbCrLf & "Process ID: " & intProcessID
Else
Wscript.Echo "Process could not be created." & _
vbCrLf & "Command line: " & strCommand & _
vbCrLf & "Return value: " & intReturn
End If
Process events monitoren
Het volgende script drukt alle events af die betrekking hebben op processen.
Je kan het script onderbreken door op Ctrl+C
te
drukken.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colMonitorProcess = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent " _
& " Within 1 WHERE TargetInstance ISA 'Win32_Process'")
WScript.Echo "Waiting for process to start or stop ..."
Do
Set objLatestEvent = colMonitorProcess.NextEvent
WScript.Echo VbCrLf & objLatestEvent.Path_.Class
Wscript.Echo "Process Name: " & objLatestEvent.TargetInstance.Name
Wscript.Echo "Process ID: " & objLatestEvent.TargetInstance.ProcessId
WScript.Echo "Time: " & Now
Loop
Als uitvoer kan je zoiets verwachten:
Hoe lang heeft een proces gelopen?
Dat kan je achterhalen met het volgende script, hoewel er een paar haken en ogen aan zitten:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colMonitorProcess = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent " _
& " Within 1 WHERE TargetInstance ISA 'Win32_Process'")
WScript.Echo "Waiting for a process to stop ..."
Do
Set objLatestEvent = colMonitorProcess.NextEvent
WScript.Echo VbCrLf & objLatestEvent.Path_.Class
Wscript.Echo "Process Name: " & objLatestEvent.TargetInstance.Name
Wscript.Echo "Process ID: " & objLatestEvent.TargetInstance.ProcessId
Wscript.Echo "Time Created: " & _
objLatestEvent.TargetInstance.CreationDate
WScript.Echo "Time Deleted: " & Now
Loop
Als "Time created" krijg je iets als
20131201164616.629138+060
, waarin met enige moeite
1 december 2013, 16:46:16 valt te herkennen (als je de cijfers na de punt
even vergeet).
Dit formaat is het DATETIME
-type, en kan je met
een functie makkelijk omzetten naar een "normaal" formaat.
Een herziene versie wordt dan:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colMonitorProcess = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent " _
& " Within 1 WHERE TargetInstance ISA 'Win32_Process'")
WScript.Echo "Waiting for process to stop ..."
Do
Set objLatestEvent = colMonitorProcess.NextEvent
strProcDeleted = Now
strProcCreated = _
WMIDateToString(objLatestEvent.TargetInstance.CreationDate)
Wscript.Echo VbCrLf & "Process Name: " & _
objLatestEvent.TargetInstance.Name
Wscript.Echo "Process ID: " & objLatestEvent.TargetInstance.ProcessId
Wscript.Echo "Time Created: " & strProcCreated
WScript.Echo "Time Deleted: " & strProcDeleted
intSecs = DateDiff("s", strProcCreated, strProcDeleted)
WScript.Echo "Duration: " & intSecs & " seconds"
Loop
'******************************************************************************
'Convert WMI DATETIME format to US-style date string.
Function WMIDateToString(dtmDate)
WMIDateToString = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & _
Left(dtmDate, 4) & " " & _
Mid(dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & _
Mid(dtmDate, 13, 2))
End Function
Werken met services
Op dit moment de volgende scripts:
Druk alle services af die in een bepaalde toestand verkeren
Je wilt alle services afdrukken die gestopt zijn. Dat kan met het volgende script:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where State = 'Stopped'")
Wscript.Echo "Stopped Services:"
For Each objService in colServices
Wscript.Echo objService.Name
Next
Werken met het Operating system
Op dit moment de volgende scripts:
Datum waarop Windows geïnstalleerd is
Onderstaand script heeft eigenlijk geen toelichting nodig:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each strOS in objOS
Wscript.Echo strOS.InstallDate
Next
De uitkomst is iets als 20041201092959.000000-480 (zie UTC datums).
Werken met het register
Lezen van een waarde uit het register
Onderstaand script haalt de waarde van UIHost
op.
Dat is de plek waar het systeem kijkt voor het logon-scherm.
Waarschijnlijk bestaat deze waarde niet meer onder Windows 7 (wel XP), dus
het script zal een lege regel afdrukken.
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject("winmgmts:\\" &_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon"
strValueName = "UIHost"
oReg.GetExpandedStringValue HKEY_LOCAL_MACHINE,strKeyPath,_
strValueName,strValue
Wscript.Echo "The Windows logon UI host is: " & strValue
Conversies van het ene formaat naar het andere
Decimaal naar hexadecimaal en omgekeerd
Decimaal naar hex
Dat kan met het volgende simpele script (waarbij
intDec
de te converteren waarde bevat):
intDec = -2147016672
WScript.Echo intDec
strHex = "&H" & Hex(intDec)
WScript.Echo strHex
Hex naar decimaal
Dat kan meet het volgende script (de hexadecimale waarde moet met &H beginnen):
strHex = "&H80072020"
WScript.Echo strHex
intDec = CLng(strHex)
WScript.Echo intDec
UTC datums naar leesbaar formaat
UTC datums als 20041201092959.000000-480 kan je met de volgende functie omzetten naar een leesbaar formaat:
Function WMIDateStringToDate(dtmInstallDate)
WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & _
Mid(dtmInstallDate, 7, 2) & "/" & Left(dtmInstallDate, 4) _
& " " & Mid (dtmInstallDate, 9, 2) & ":" & _
Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate, _
13, 2))
End Function
De underscores ('_') aan het eind van de regel laten zien dat dit hele script eigenlijk maar uit 1 regel code bestaat.
De method CDate
zet
een datum in string-formaat om in een echt datum-formaat.
Werken met Internet Explorer
Om deze sectie te begrijpen zal je informatie over het objectmodel van IE moeten kunnen vinden. Dat kan je op de Microsoft MSDN-pagina The Internet Explorer Object Model
Op deze pagina vind je o.a. de Navigate
-method en
document
-property die in onderstaand voorbeeld
gebruikt worden.
Misbruik maken van IE om tekst in het klembord (clipboard) te zetten
strCopy = "This text has been copied to the clipboard."
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", strCopy
objIE.Quit
Op
deze pagina van Microsoft MSDN vind je meer over
het clipboardData
-object.
Na bovenstaand voorbeeld zou de tekst in de variabele
strCopy
in het klembord moeten staan (maar bij mij,
onder Windows 7 werkt het niet).
Ik heb na alle 3 cruciale commando's gecontroleerd of er een fout optreedt, maar dat is niet het geval.
Werken met Excel
Op dit moment de volgende scripts:
Zet gegevens in een cel van een spreadsheet
Het volgende script zet de tekst Testwaarde
in
cell helemaal linksboven (rij 1, kolom 1) van een nieuw spreadsheet:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value = "Testwaarde"
In plaats van getallen voor kolom- en rijnummer, kan je ook variabelen gebruiken.
Als je dus bv. een verzameling bestanden hebt, zou je in kolom 1 de bestandsnamen kunnen zetten, en in kolom 2 de datum waarop ze voor het laatst gewijzigd zijn.
Werken met netwerken
Het netwerk object, en computernaam en gebruikersnaam opvragen
Er is een speciaal netwerk object, en dat heeft o.a. als eigenschappen de computernaam en de gebruikersnaam. Zie de volgende code:
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strUser = objNetwork.UserName
Pingen van andere computers
Sinds Windows XP is de class Win32_PingStatus
aan
WMI toegevoegd.
Je moet deze klasse op een vrij unieke manier aanroepen:
Set colPings = objWMIService.ExecQuery _
("SELECT * FROM Win32_PingStatus WHERE Address = '" &
strComputer & "'")
Als resultaat krijg je een soort status code,
StatusCode
Het werkt het handigste om een functie te gebruiken om de status codes af te vangen:
Function PingStatus(strComputer)
On Error Resume Next
strWorkstation = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strWorkstation & "\root\cimv2")
Set colPings = objWMIService.ExecQuery _
("SELECT * FROM Win32_PingStatus WHERE Address = '" & strComputer & "'")
For Each objPing in colPings
Select Case objPing.StatusCode
Case 0 PingStatus = "Success"
Case 11001 PingStatus = "Status code 11001 - Buffer Too Small"
Case 11002 PingStatus = "Status code 11002 - Destination Net Unreachable"
Case 11003 PingStatus = "Status code 11003 - Destination Host Unreachable"
Case 11004 PingStatus = _
"Status code 11004 - Destination Protocol Unreachable"
Case 11005 PingStatus = "Status code 11005 - Destination Port Unreachable"
Case 11006 PingStatus = "Status code 11006 - No Resources"
Case 11007 PingStatus = "Status code 11007 - Bad Option"
Case 11008 PingStatus = "Status code 11008 - Hardware Error"
Case 11009 PingStatus = "Status code 11009 - Packet Too Big"
Case 11010 PingStatus = "Status code 11010 - Request Timed Out"
Case 11011 PingStatus = "Status code 11011 - Bad Request"
Case 11012 PingStatus = "Status code 11012 - Bad Route"
Case 11013 PingStatus = "Status code 11013 - TimeToLive Expired Transit"
Case 11014 PingStatus = _
"Status code 11014 - TimeToLive Expired Reassembly"
Case 11015 PingStatus = "Status code 11015 - Parameter Problem"
Case 11016 PingStatus = "Status code 11016 - Source Quench"
Case 11017 PingStatus = "Status code 11017 - Option Too Big"
Case 11018 PingStatus = "Status code 11018 - Bad Destination"
Case 11032 PingStatus = "Status code 11032 - Negotiating IPSEC"
Case 11050 PingStatus = "Status code 11050 - General Failure"
Case Else PingStatus = "Status code " & objPing.StatusCode & _
" - Unable to determine cause of failure."
End Select
Next
End Function
In het echte script kan je dan bepalen welke computer(s) je wilt pingen, en iets doen met de status:
On Error Resume Next
strComputer = "tower-1"
strPingStatus = PingStatus(strComputer)
If strPingStatus = "Success" Then
Wscript.Echo "Success pinging " & strComputer
Else
Wscript.Echo "Failure pinging " & strComputer & ": " & strPingStatus
End If
Werken met tijd
Vertraging
Als je een script een bepaalde tijd niets wilt laten doen geef je het volgende
commando:
WScript.Sleep 30000
Dit script doet 30 seconden niets.
Je zou ook een script kunnen maken dat alleen maar 30 (of een ander aantal) seconden niets doet, gewoon om een proces te creëren en er mee te kunnen spelen of het te kunnen onderzoeken.
Datums die t.o.v. een andere datum in de toekomst of verleden liggen
Zie het volgende script:
dtVandaag = Date()
WScript.Echo "Vandaag is het: " & dtVandaag
dtGister = dtVandaag - 1
WScript.Echo "Gisteren was het: " & dtGister
dtGister2 = DateAdd("d",-1,dtVandaag)
WScript.Echo "Gisteren was het: " & dtGister2
Uitvoer:
Vandaag is het: 9-12-2013
Gisteren was het: 8-12-2013
Gisteren was het: 8-12-2013
De 1e methode om een aantal dagen voor- of achteruit te rekenen is gewoon dat getal bij een bepaalde datum op te tellen.
Een veel geavanceerdere methode is gebruik maken van de functie
DateAdd
, waarmee je ook maanden, jaren e.d. naar
voren of achteren kunt.
Meer info over DateAdd
vind je
op Technet.
Werken met strings
Werken met gebruikers, groepen, rechten
Groep object binnenhalen
Om een object aan te maken dat bv. de groep
Administrators
bevat, hoef je alleen maar de
volgende regel uit te voeren:
Set objGroup = GetObject("WinNT://" & strComputer & "/
Administrators")
Leden van een groep
De leden van een groep zitten in de Members
-property
van het groep-object (opgeslagen als een array).
Om dus iets met elk lid van een groep te doen, doe je het volgende:
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser in objGroup.Members
...
Next
Diversen
Op dit moment de volgende scripts:
- Kopieer een string naar het klembord
- Commandoregel commando uitvoeren (bv. dir)
- CapsLock aan- of uitzetten
- Dubbele dubbele quotes (hoe nest je ze binnen elkaar?)
- Een hoeveelheid (tijd) genereren gebaseerd op toeval
Kopieer een string naar het klembord
Commandoregel commando uitvoeren (bv. dir)
Dat doe je bv. als volgt:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k dir"), 1, TRUE
Voor uitgebreide uitleg zie hier.
CapsLock aan- of uitzetten
Met het volgende script kan je de status van CapsLock veranderen van aan in uit of omgekeerd:
Set objShell = CreateObject("WScript.Shell")
objShell.SendKeys "{Capslock}"
Dubbele dubbele quotes (hoe nest je ze binnen elkaar?)
Commando's en bestandsnamen met spaties erin moet je tussen dubbele quotes zetten. Maar wat als je zo'n bestandsnaam in zo'n commando moet gebruiken?
Je wilt bv. een bestand (met spatie) openen met
Notepad
(Kladblok)
notepad.exe "C:\Mijn Scripts\Log.txt"
en dat weer laten uitvoeren via objShell
:
objShell.Run "notepad.exe "C:\Mijn Scripts\Log.txt""
Dat werkt dus niet, want na de 2e dubbele quote denkt Basic dat de string is afgelopen. Je krijgt dus 1 of andere foutmelding.
De oplossing is het gebruik van de functie Chr
Daarme kan je een willekeurig getal omzetten naar het bijbehorende ANSI teken.
In dit geval heb je chr(34)
nodig:
"notepad.exe " & chr(34) & "C:\Mijn Scripts\Log.txt" &
chr(34)
Een hoeveelheid (tijd) genereren gebaseerd op toeval
Het volgende script wacht een willekeurige (binnen zekere grenzen) hoeveelheid tijd:
intMax = 30 'seconds
intMin = 20 'seconds
Randomize
intWait = Int((intMax - intMin + 1) * Rnd + intMin)
WScript.Echo "Start: pausing for " & intWait & " seconds."
WScript.Sleep intWait * 1000
WScript.Echo "Stop"
De grenzen zijn in dit geval 20 en 30 seconden.
Links
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 12-02-23 13:26:56