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); }




Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).



Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь





HTML и CSS
корректный
my counter

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка link О авторе Фитотерапия Молитвы Водолечение Юмор Форум Кладовка Ссылки О авторе Отправить сообщение Карта сайта Поиск по сайту Главная страница