KB » Computer » VBScript kookboek

VBScript kookboek

    Tweeten

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

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 REDIMcommando (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)

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.




    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 8-12-2014 23:44:00