WSH скрипты. Примеры.
Здесь будут рассмотрены различные примеры Windows Script Host (WSH) скриптов.Свойство Environment
Возвращает объект, который позволяет получить значения переменных средыПример использования:
var f1 = WScript.CreateObject("WScript.Shell");
var f2 = f1.Environment("Process");
WScript.Echo(f2("windir"));
Свойство SpecialFolders.
Возвращает путь к специальным папкам.Возможно получить путь к следующим папкам:
AllUsersDesktop, AllUsersStartMenu, AllUsersPrograms, AllUsersStartup, Desktop, Favorites, Fonts, MyDocuments, NetHood, PrintHood, Programs, Recent, SendTo, StartMenu, Startup, Templates.
Пример использования:
var f1 = WScript.CreateObject("WScript.Shell");
var f3 = f1.SpecialFolders("AllUsersDesktop");
WScript.Echo(f3);
Пример WSH скрипта копирования файла.
// JScript.
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
FSO.CopyFile("c:\\COMPlusLog.txt", "c:\\x\\");
Следующий пример создает ярлык URL на рабочем столе
// JScript.
var Shell, DesktopPath, URL;
Shell = new ActiveXObject("WScript.Shell");
DesktopPath = Shell.SpecialFolders("Desktop");
URL = Shell.CreateShortcut(DesktopPath + "\\MSDN Scripting.url");
URL.TargetPath = "HTTP://MSDN.Microsoft.com/scripting/";
URL.Save();
WSH скрипт может установить новый принтер в Windows, инициировать установку драйверов.
// JScript.
var net;
net = new ActiveXObject("WScript.Network");
net.AddWindowsPrinterConnection("\\\\ServerName\\PrinterName");
В этом примере WSH скрипт присваивает назначенную пользователем букву сетевому диску
// JScript.
var net;
net = new ActiveXObject("WScript.Network");
net.MapNetworkDrive("I:", "\\\\computer2\\public","True");
В следующем примере мы рассмотрим важную практическую задачу: выбрать средствами windows папку и передать в bat / cmd файл имя папки и путь к ней.
FOR /F "usebackq delims=" %%i IN (`cscript //nologo foldsel.js`) do set sfold=%%i
if defined sfold (
echo Select folder: [%sfold%].
) else (
echo No select folder
)
var objShellApp = new ActiveXObject('Shell.Application');
var Folder = objShellApp.BrowseForFolder(0, 'SELECT FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');
try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};
catch (e){};
WScript.Echo(Folder.Self.Path);
Этот же пример можно записать и так
function fnShellBrowseForFolderJ()
{
var objShell = new ActiveXObject("shell.application");
var objFolder;
objFolder = objShell.BrowseForFolder(0, "Выберите каталог", 0);
if (objFolder != null) return (objFolder.Self.Path); else return ("");
}
WScript.Echo(fnShellBrowseForFolderJ());
Свернуть все окна рабочего стола Windows
var f1 = WScript.CreateObject("Shell.Application");
f1.MinimizeAll();
Развернуть все окна рабочего стола Windows
WScript.CreateObject("Shell.Application").UndoMinimizeAll();
Запуск проводника Windows с определённой открытой папкой.
var f1 = WScript.CreateObject("Shell.Application");
f1.Explore("d:\\00tt\\");
Определить объем оперативной памяти
var f1 = WScript.CreateObject("Shell.Application");
WScript.Echo(f1.GetSystemInformation("PhysicalMemoryInstalled"));
Вызов окна "Запуск программы"
var f1 = WScript.CreateObject("Shell.Application");
f1.FileRun();
Вызов окна выключения и перезагрузки компьютера
var f1 = WScript.CreateObject("Shell.Application");
f1.ShutdownWindows();
Вызов окна Сетевые подключения Панели управления
var f1 = WScript.CreateObject("Shell.Application");
f1.ControlPanelItem("ncpa.cpl");
Вызов окна Internet properties
var f1 = WScript.CreateObject("Shell.Application");
// Internet properties
f1.ControlPanelItem("Inetcpl.cpl");
Вызов окна Regional Settings properties
var f1 = WScript.CreateObject("Shell.Application");
// Regional Settings properties
f1.ControlPanelItem("ntl.cpl");
Вызов окна Network properties
var f1 = WScript.CreateObject("Shell.Application");
// Network properties
f1.ControlPanelItem("Netcpl.cpl");
Вызов окна Password properties
var f1 = WScript.CreateObject("Shell.Application");
// Password properties
f1.ControlPanelItem("Password.cpl");
Вызов окна System properties and Add New Hardware wizard
var f1 = WScript.CreateObject("Shell.Application");
// System properties and Add New Hardware wizard
f1.ControlPanelItem("Sysdm.cpl");
Вызов окна Desktop Themes
var f1 = WScript.CreateObject("Shell.Application");
// Desktop Themes
f1.ControlPanelItem("Themes.cpl");
Вызов окна Date/Time properties
var f1 = WScript.CreateObject("Shell.Application");
// Date/Time properties
f1.ControlPanelItem("TimeDate.cpl");
Вызов апплета можно производит непосредственно используя Rundll32.exe. Тогда, например, вызов окна установки даты и времени может выглядеть так:
WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("Rundll32.exe shell32.dll,Control_RunDLL timedate.cpl");
На странице с описанием команды Rundll32 можно найти большое количество примеров ее использования. Следовательно, поменяв в примере, приведенном выше, последнюю строку можно получить все эти возможности из WSH.
В следующем примере открывается окно браузера с требуемой страницей.
WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("rundll32 url.dll,FileProtocolHandler http://krasner.ru");
Пример WSH скрипта вызова окна проводника Windows "поиск компьютера"
var f1 = WScript.CreateObject("Shell.Application");
f1.FindComputer();
Вывод модального окна с заголовком окна, текстом вопроса и кнопками ДА и НЕТ. Так же определен срок, по истечении которого окно будет принудительно закрыто (код возврата -1).
var f1 = WScript.CreateObject("WScript.Shell");
var f3 = f1.Popup ("Вы понимаете о чем идет речь?",80,"Контрольный вопрос", 4+32);
WScript.Echo(f3);
Выбор файла через проводник
var objDialog = new ActiveXObject('UserAccounts.CommonDialog');
objDialog.Filter="WSH скрипты (*.vbs, *.js)|*.vbs;*.js|Все файлы (*.*)|*.*";
objDialog.InitialDir ="c:\\";
var intResult = objDialog.ShowOpen();
if (intResult == 0) WScript.quit(); else WScript.Echo(objDialog.FileName);
Определить дату установки Windows
with (new ActiveXObject('WScript.Shell')) {
var raw = RegRead('HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\InstallDate');
with (new Date(1970, 0, 1)) {
WScript.echo(new Date(setSeconds(getSeconds() + raw)));
}
}
Издать звук (гудок) динамиком.
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("%comspec% /c echo "+String.fromCharCode(7),0,true);
или то же самое на VBS
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "%comspec% /c echo " & Chr(7), 0, True
В следующем примере WSH скрипт через командный процессор (cmd) вызывает команду dir и далее обрабатывает результаты ее работы. Сам пример возможно и не так так уж интересен (хотя такая задача, как выбор файлов из папки по маске отсортированных по дате не столь уж и тривиальная для скрипта), а вот возможность обработки StdIn, StdOut и StdErr открывает дополнительные перспективы.
var sh = new ActiveXObject('WScript.Shell');
var ex = sh.Exec('cmd /c dir /B /O:-D "C:\\Windows\\System32\\*.sys"');
var stdout = [];
var stderr = [];
while ( true ) {
if ( ! ex.StdOut.AtEndOfStream ) {
stdout.push(ex.StdOut.ReadLine());
continue;
}
if ( ! ex.StdErr.AtEndOfStream ) {
stderr.push(ex.StdErr.ReadLine());
continue;
}
if ( ex.Status == 1 ) {
break;
}
}
WScript.Echo('\nEXIT CODE :\n' + ex.ExitCode);
WScript.Echo('\nSTDERR :\n' + stderr.join('\n'));
WScript.Echo('\nSTDOUT :\n' + stdout.join('\n'));
WScript.Quit();
Еще один пример WSH скрипта для работы с StdIn и StdOut. На сей раз на VBS.
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("nslookup")
Set InStream = WshExec.StdIn
InStream.WriteLine "help"
InStream.WriteLine "exit"
Set OutStream = WshExec.StdOut
Str = vbNullString
While Not OutStream.AtEndOfStream
Str = Str & Trim(OutStream.ReadLine()) & vbCrLf
Wend
MsgBox Str
Еще один пример WSH скрипта, который запускает внешнюю программу с параметром и обрабатывает вывод этой программы:
try
{
var shell = WScript.CreateObject("WScript.Shell");
var exec = shell.Exec("ipconfig /all");
while(exec.Status == 0) // wait
WScript.Sleep(100);
var output = "";
if(!exec.StdOut.AtEndOfStream)
output = exec.StdOut.ReadAll();
WScript.Echo("ipconfig:\n\n" + output);
}
catch(error)
{
WScript.Echo("Код ошибки: " + error.number + "\n" + error.description);
}
Если в предыдущем примере использовать другую команду, то при русской локализации могут возникнуть сложности из-за того, что вывод команды осуществляется в DOS кодировке. В таком случае при необходимости вывода строку следует перекодировать в WIN(1251) кодировку. Используем для этого функцию, написанную на VBS.
<job>
<script language="VBScript">
Function D2W(DOS_STRING)
'DOS:
'128(А)-175(п)
'224(р)-239(я)
'240(Ё),241(ё)
'WIN:
'192(А)-255(я)
'184(ё),168(Ё)
If Len(DOS_STRING)=0 Then Exit Function
For i=1 To Len(DOS_STRING)
s=Asc(Mid(DOS_STRING,i,1))
If s>=128 And s<=175 Then
D2W = D2W & Chr(s + 64)
ElseIf s >=224 And s <=239 Then
D2W = D2W & Chr(s + 16)
ElseIf s=240 Then
D2W = D2W & Chr(168)
ElseIf s=241 Then
D2W = D2W & Chr(184)
Else
D2W = D2W & Chr(s)
End If
Next
End Function
</script>
<script language="JScript">
try
{
var shell = WScript.CreateObject("WScript.Shell");
var exec = shell.Exec("ping 192.168.1.15");
while(exec.Status == 0) // wait
WScript.Sleep(100);
var output;
if(!exec.StdOut.AtEndOfStream)
output = exec.StdOut.ReadAll();
WScript.Echo("ping:\n\n" + D2W(output));
}
catch(error)
{
WScript.Echo("Код ошибки: " + error.number + "\n" + error.description);
}
</script>
</job>
Несколько примеров как из Windows Script Host (WSH) создавать ярлыки.
var WshShell,myShortcut;
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Определяем путь к рабочему столу
pathDesktop = WshShell.SpecialFolders("Desktop");
//Создаем ярлык на рабочем столе
myShortcut = WshShell.CreateShortcut(pathDesktop+"\\notepad.lnk");
//Устанавливаем путь к файлу
myShortcut.TargetPath =
WshShell.ExpandEnvironmentStrings("%windir%\\notepad.exe");
//Назначаем рабочий каталог
myShortcut.WorkingDirectory = "c:\\temp";
//Указываем аргументы командной строки
myShortcut.Arguments = "d:\\myscript\\MakeShortcut.js ";
//Выбираем иконку из файла notepad.exe
myShortcut.IconLocation = "notepad.exe, 0";
//Сохраняем ярлык
myShortcut.Save();
Как следует из комментариев, скрипт создает на рабочем столе ярлык для запуска программы notepad.
В приведенном примере умышленно присутствует некоторая избыточность. Обычно нет необходимости определять рабочий каталог, аргументы командной строки, иконку. В этом случае ваш код будет просто короче.
Следующий пример демонстрирует как Windows Script Host (WSH) может создавать ярлыки для сетевых ресурсов.
var WshShell,myUrlLink;
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Определяем путь к рабочему столу
pathDesktop = WshShell.SpecialFolders("Desktop");
//Создаем ярлык на рабочем столе
myUrlLink = WshShell.CreateShortcut(pathDesktop+"\\Best Web Site.URL");
//Устанавливаем путь к сайту
myUrlLink.TargetPath = "http://www.celitel.info";
//Сохраняем ярлык
myUrlLink.Save();
Несколько примеров как из Windows Script Host (WSH) выполнять запросы Windows Management Instrumentation (WMI) и обрабатывать результаты.
В следующем примере - вывод всех локальных аккаунтов на компьютере:
//Подключились к WMI локального компьютера (".")
var root = GetObject("winmgmts:\\\\.\\root\\cimv2");
//Выполнили запрос на получение всех локальных аккаунтов на компьютере
var reswmi =
root.ExecQuery("SELECT * FROM Win32_Account where LocalAccount = true and SIDType = 1");
//Вывели их имена и описания
for(var acc = new Enumerator(reswmi); !acc.atEnd(); acc.moveNext())
WScript.Echo(acc.item().Name + " - " + acc.item().Description);
Немного изменим запрос) - и получаем список процессов на компьютере
//Подключились к WMI локального компьютера (".")
var root = GetObject("winmgmts:\\\\.\\root\\cimv2");
//Выполнили запрос на получение всех процессов на компьютере
var reswmi = root.ExecQuery("Select * from Win32_Process");
//Вывели их имена
var s="";
for(var acc = new Enumerator(reswmi); !acc.atEnd(); acc.moveNext())
s=s+acc.item().Name + "\n";
WScript.Echo(s);
В следующем примере WSH используя запрос к WMI получает список логических дисков. Да, в WSH есть собственные методы для этого, и, как мне кажется, они более уместны для такого случая. Здесь просто рассмотрена еще одна возможность.
//Подключились к WMI локального компьютера (".")
var root = GetObject("winmgmts:\\\\.\\root\\cimv2");
//Выполнили запрос на получение логических дисков на компьютере
var reswmi = root.ExecQuery("Select * from Win32_LogicalDisk");
//Вывели их имена
var s="";
for(var acc = new Enumerator(reswmi); !acc.atEnd(); acc.moveNext())
s=s +acc.item().DeviceID +" " + acc.item().VolumeName +" " +
acc.item().Description +" " + acc.item().VolumeSerialNumber+"\n";
WScript.Echo(s);
Пример получения сведений об операционной системе. WSH + WMI.
//Подключились к WMI локального компьютера (".")
var root = GetObject("winmgmts:\\\\.\\root\\cimv2");
//Выполним запрос на получение сведений об операционной системе
var reswmi = root.ExecQuery("SELECT * FROM Win32_OperatingSystem");
var accitem;
for(var acc = new Enumerator(reswmi); !acc.atEnd(); acc.moveNext())
accitem=acc.item();
var s = 'короткое описание версии операционной системы ' +
accitem.Caption + "\r\n"+
'номер билда операционной системы ' +
accitem.BuildNumber + "\r\n"+
"номер версии операционной системы " +
accitem.Version + "\r\n"+
'имя операционной системы ' + accitem.Name + "\r\n"+
'тип операционной системы: ' + accitem.OSType + "\r\n"+
'версия сервис-пака ' +
accitem.ServicePackMajorVersion + "\r\n"+
'язык операционной системы ' +
accitem.OSLanguage + "\r\n"+
'код региона, который использует операционная система ' +
accitem.CountryCode + "\r\n"+
'идентификатор языка, используемого операционной системой ' +
accitem.Locale + "\r\n"+
'дата-время установки ' + accitem.InstallDate + "\r\n"+
'имя компьютера ' + accitem.CSName + "\r\n"+
'организация, на которую зарегистрирована операционная система ' +
accitem.Organization + "\r\n"+
'серийный номер ' + accitem.SerialNumber + "\r\n"+
'зарегистрированный пользователь операционной системы ' +
accitem.RegisteredUser + "\r\n"+
'временная зона; число минут смещения от времени по Гринвичу' +
accitem.CurrentTimeZone + "\r\n"+
'дата + время последней загрузки ' +
accitem.LastBootUpTime + "\r\n\r\n";
WScript.Echo(s);
WSH + WMI. Класс Win32_ComputerSystem
//Подключились к WMI локального компьютера (".")
var root = GetObject("winmgmts:\\\\.\\root\\cimv2");
var reswmi = root.ExecQuery("SELECT * FROM Win32_ComputerSystem");
var accitem;
for(var acc = new Enumerator(reswmi); !acc.atEnd(); acc.moveNext())
accitem=acc.item();
var s = 'имя компьютера ' + accitem.Caption + "\r\n"+
'домен ' + accitem.Domain + "\r\n"+
'роль компьютера в домене ';
if (accitem.DomainRole == 0 ) s +='Standalone Workstation';
if (accitem.DomainRole == 1 ) s +='Member Workstation';
if (accitem.DomainRole == 2 ) s +='Standalone Server';
if (accitem.DomainRole == 3 ) s +='Member Server';
if (accitem.DomainRole == 4 ) s +='Backup Domain Controller';
if (accitem.DomainRole == 5 ) s +='Primary Domain Controller';
s +='\r\n';
s +='всего физической памяти (байт) ' +
accitem.TotalPhysicalMemory + "\r\n";
WScript.Echo(s);
Следующий пример использования WMI в WSH - определить установленные кодеки.
var wbemFlagReturnImmediately = 0x10;
var wbemFlagForwardOnly = 0x20;
var objWMIService = GetObject ("winmgmts:\\\\.\\root\\CIMV2");
var colltems =objWMIService.ExecQuery("SELECT * FROM Win32_CodecFile",
"WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly);
var enumltems = new Enumerator(colltems);
var infoList;
for (; !enumltems.atEnd(); enumltems.moveNext())
{
var objltem = enumltems.item();
infoList = "Имя: " + objltem.Caption + "\r\n";
infoList = infoList + "Расширение: " + objltem.Extension + "\r\n";
infoList = infoList + "Тип кодека: " + objltem.Group + "\r\n";
infoList = infoList + "Производитель: " + objltem.Manufacturer + "\r\n";
infoList = infoList + "Версия: " + objltem.Version + "\r\n";
WScript.Echo(infoList);
}
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь