Пишем програми (скриптове) в Windows Notepad. Не можеш да предвидиш всичко. Използвайте правилно двойните кавички

7 декември 2006 г. Бил Стюарт

Подобрете вашите скриптове Скриптовете от командния ред са обикновени текстови файлове, които се интерпретират от шел процесора като набор от команди, които трябва да се изпълняват последователно. Историята на скриптовете от командния ред започва в зората

Подобрете вашите скриптове

Скриптовете на командния ред са обикновени текстови файлове, които се интерпретират от шел процесора като набор от команди, които трябва да се изпълняват последователно. Историята на скриптовете на командния ред датира от началото на 80-те години на миналия век – от това време до днес, обвивката на Command.com в MSDOS поддържа скриптове чрез прости пакетни файлове. Издаден през 1993 г. с Windows NT, друг команден процесор, Cmd.exe, също поддържа език за програмиране на макроси, подобен на езика на командните файлове на Command.com. Въпреки напредналата възраст на технологията, макропрограмирането в обвивката Cmd.exe все още се използва широко от ИТ специалистите. Например прост скрипт с За командаможе да превърне команда, която сама по себе си работи само на един компютър или потребител в даден момент на командния ред, в команда, която преминава през друг текстов файли се изпълнява за всеки ред в този файл. Тъй като скриптовете от командния ред са обикновени текстови файлове, които представляват набор от команди, те са лесни за създаване, модифициране и лесни за четене. Но простотата на макропрограмирането е измамна. Небрежен скрипт за команден процесорможе да причини проблеми. Виждал съм как шел скриптове с неправилни предположения за компютърната среда и операционната система в най-добрият случайработи неправилно, а в най-лошия - внезапно извършва разрушителни действия върху системите. За да помогна на читателите да избегнат подобни проблеми, подготвих 10 съвета за създаване на по-стабилни скриптове, които могат да работят в много компютърни среди.

Използвайте променливи на средата, когато е възможно

Когато използваме променлива в скрипт, ние затваряме името на променливата между знаците за процент (%) и когато скриптът се изпълни, знаците за процент и текстът между тях се заменят със стойността на тази променлива. Използването на променливи прави кода на скрипта по-гъвкав, така че е по-вероятно да работи успешно различни компютри. Например, в шел скрипт, не кодирайте твърдо инсталационната директория на Windows. Вместо това трябва да използвате променливата SystemRoot, която винаги ще сочи към конкретна инсталационна директория на Windows. Да, отборът

echo %SystemRoot%

ще покаже съдържанието на SystemRoot (т.е. инсталационната директория на Windows). Виждал съм много сценарии, при които записът C:WINDOWS се използва за насочване към инсталационната директория на Windows. Ако Windows не е инсталиран в C:WINDOWS (например Windows 2000 или по-нова версия ранни версииса зададени на WINNT), скриптът няма да работи правилно. За да видите списък с променливи на средата, въведете командата Set в командния ред. Някои променливи не се появяват в генерирания списък Задайте командатъй като те се генерират динамично от Cmd.exe. V раздел. единпоказва се списък с тези променливи. Както при другите променливи на средата, тези променливи са затворени в знаци за проценти. Например, следният ред от скрипт ще се покаже текущо времеи дата:

ехо %DATE% %TIME%

Не очаквайте обикновените пакетни файлове за Command.com да работят също толкова добре в Cmd.exe

Тези, които са свикнали да пишат пакетни файловеза платформи MS-DOS или Windows 9x/Me, моля, имайте предвид, че най-новата Версии на Windowsнякои команди не съществуват. Двата най-често срещани примера са екипите Choice и Deltree. Прегледайте старите си пакетни файлове, за да се уверите, че работят правилно в обвивката Cmd.exe. V раздел. 2няколко възможни заместванияза Choice и Deltree. Повечето замествания имат различен синтаксис от командите, които заменят, така че ще трябва да промените съответно вашите скриптове.

В обвивката Cmd.exe използвайте разширението .cmd

Командните файлове на Command.com изискват разширение .bat. Обвивката Cmd.exe също може да използва разширението .bat, но в по-мощния език за програмиране на макроси Cmd.exe много команди са несъвместими с Command.com. По този начин, . bat файл, написан за Cmd.exe, може да се провали, ако потребителят се опита да го изпълни в Command.com (например в Windows 98). Един от начините да избегнете този проблем е да използвате разширението .cmd за скриптове. Тъй като Command.com не разпознава разширението .cmd, той просто няма да изпълни пакетен файл, ако името му завършва на .cmd.

Уверете се, че необходимите изпълними файлове са налични

Ако вашият скрипт включва програми, които не са част от стандартна инсталацияоперационна система, трябва да се внимава да се гарантира, че всички такива програми са налични. Вие също трябва да документирате тези зависимости във вашите скриптове. Предлагам да поставите изпълними файлове в същата директория като скрипта, за да ги направите достъпни. След това синтаксисът се използва за тяхното изпълнение

"%~dp0exename" ...

където exename е името на изпълнимия файл, който трябва да се стартира. Синтаксисът %~dp0 връща устройството, пътя и името на файла на текущия скрипт без кавички. Ограждането на целия низ в кавички гарантира, че скриптът ще работи, дори ако името на файла или директорията, съдържащи скрипта, съдържа кавички.

Използвайте правилно двойните кавички

Изглежда, двойни кавички(") са често срещан източник на объркване за сценаристите. Двойните кавички са просто начин за идентифициране на аргументи на командния ред, съдържащи интервали. Например, привидно правилният команден ред

dir C: Program Files

всъщност дава команда Дирдва аргумента: C:Program и Files. За да изпълним намерението си да предадем един аргумент C:Program Files на командата (включително пространството), трябва да го поставим в двойни кавички:

dir "C: Program Files"

Знаците за кавички не са част от името на папката. Те казват на командата Dir, че текстът между тях е един аргумент.

Shell скриптовете също поддържат опции на командния ред. За да използвате опциите на командния ред на скрипта, трябва да използвате записа %n (където n е число между 0 и 9). Този запис се нарича заместващ параметър (или просто параметър). Например, скриптът ще замени параметър %1 с първия аргумент на командния ред, %2 с втория аргумент и т. н. В допълнение към параметрите %1 до %9, %0 се заменя с името на скрипта, %* се заменя с целия команден ред на скрипта (с изключение на името на скрипта) . Тук споменавам опциите на командния ред, защото когато Cmd.exe замени опциите %1 до %9 със съответните аргументи на командния ред, той оставя двойните кавички, ако има такива в аргумента. Очевидното заключение е, че параметърът на скрипт винаги ще бъде затворен в кавички, ако съдържа интервали. Въз основа на това наблюдение има няколко прости правила, които, ако се спазват внимателно, могат почти напълно да премахнат проблемите с цитатите.

  • Не използвайте кавички в параметрите на скрипта (%1 до %9), тъй като те може вече да съдържат кавички. Ако трябва да използвате параметър с команда If, използвайте знаци, различни от кавички (например брекети), за да избегнете синтактична грешка. Следният ред ще работи правилно, дори ако първият параметър (%1) съдържа кавички:

Ако (%1)==() Отидете на:HELP

Изключението от това правило е, когато използваме синтаксиса %~n, за да премахнем кавичките на параметрите (вижте следващото правило).

  • Не поставяйте кавички вътре променлива на средата. Разрешени са интервали в променливите на средата и не са необходими кавички. Ако искате да копирате параметъра в променлива, използвайте синтаксиса %~n (където n е число между 1 и 9), което връща параметъра без кавички. Например линията

    Задайте DATAFILE=%~1
    ще копира първия параметър на скрипта (без кавичките) в променливата DATAFILE. Изключението е, когато създавате цитиран текст, който ще бъде предаден на друга команда.

  • Не забравяйте да цитирате променливи на средата, когато е необходимо. Например, помислете за следните редове на скрипт:

    Задайте TARGET=%~2
    Копирайте %1 "%TARGET%"

Първият от тези редове копира втория аргумент на скрипта в променливата TARGET, премахвайки кавичките. Вторият ред е синтактично правилен, тъй като параметърът %1 вече е в кавички, ако съдържа интервали, а променливата TARGET трябва да бъде в кавички, тъй като може да съдържа интервали.

Използвайте командите Setlocal и Endlocal

Командата Setlocal копира всички променливи на средата, а командата Endlocal възстановява всички променливи до стойностите, които са имали преди изпълнението на скрипта. Endlocal също така премахва всички променливи, създадени от скрипта. Използването на двете команди прави скрипта по-самостоятелен и гарантира, че скриптът „почиства боклука“, като възстановява променливите на средата в техните оригинални стойностии изтриване на променливи, създадени от скрипта.

Можете също да използвате командата Setlocal Enableextensions, за да се уверите, че командните разширения са активирани. Разширенията за команди са подобрения на групата вътрешни команди Cmd.exe (например If, For, Call), които предоставят допълнителна функционалност в сравнение с командите Command.com, които имат същото име. Разширенията за команди са активирани по подразбиране, но в редките случаи, когато са деактивирани, командата Setlocal Enableextensions гарантира, че командните разширения са активирани. За повече информация относно командните разширения въведете командния ред Cmd ред /?.

Използвайте escape символа, ако е необходимо

Cmd.exe използва знака карета (^) като знак за отмяна на специалното значение на запазените знаци на обвивката. Например, амперсандът (&) е разделител на команди - той ви позволява да поставите няколко команди на един и същи ред. Ако възнамерявате да използвате амперсанда в обичайния, литературен смисъл, тогава трябва да го „анулирате“. специално значение, като поставите символ на карета ^ пред него. Да, в опашката

Echo Знакът ^& е
разделителя на командите

символът ^ принуждава обвивката да отмени нормалната интерпретация на символа, който го следва. Специални символиса символите () ^ & |. Не е необходимо да използвате флаг за отмяна, ако тези знаци се срещат в низ в кавички.

Не използвайте командата Exit без превключвателя /b

Без превключвателя /b, командата Exit затваря текущата обвивка. Ако някой стартира Cmd.exe и изпълни скрипт, който съдържа команда Exit, текущата сесия на обвивката ще приключи внезапно. Командата Exit /b затваря текущия скрипт, без да затваря текущата сесия на обвивката. За да научите повече за командата Exit, въведете Exit /? в командния ред.

Използвайте внимателно командата If Errorlevel

Командата If Errorlevel проверява изходния код на последната команда, която е завършила изпълнението. Поведението на скрипта зависи от резултата от проверката на изходния код на програмата. Помислете например за следния сценарий:

моята програма
Ако ниво на грешка 1 Отидете до:ГРЕШКА

Командата Goto на тези редове ще бъде изпълнена само ако Myprogram.exe върне код за изход, по-голям или равен на 1. С други думи, "Ако ниво на грешка n" не означава "ако последният код за изход на програмата е точно n"; всъщност това условие означава "ако последният изходен код на програмата не е по-малък от n". Като се има предвид това поведение, трябва да проверите кода за излизане от програмата в низходящ ред (от най-големия към най-малкия). За да проверите за конкретна стойност на кода за изход от програмата, използвайте динамичната променлива ERRORLEVEL вместо командата If Errorlevel. Имайте предвид, че командата If Errorlevel е различна от променливата ERRORLEVEL, изброена в таблица 1. 1. Командата If Errorlevel е обратно съвместима с командата If Errorlevel от Command.com; променливата ERRORLEVEL е налична само в Cmd.exe.

Помислете за особеностите на командата Старт

Командата Старт стартира програма или команда в прозорец нова конзола. Въпреки това, ако се опитате да стартирате програма от папка, която съдържа интервали (или ако името на програмата съдържа интервали), поведението на командата Старт може да не е това, което очаквате. Например следната команда:

Стартирайте "C:\Program Files\Microsoft
OfficeOffice11Winword.exe"

не стартира Microsoft Word, както се очаква. Вместо това команда за стартиранеще отвори нова сесия Cmd.exe със заглавието на прозореца на конзолата, зададено на низа в кавички. Това поведение се дължи на факта, че командата Start използва първия низ в кавички в командния си ред като заглавие на прозореца на конзолата.

За да заобиколите тази странност, използвайте двойка кавички, за да посочите празна заглавка, след което въведете реда на програмата, която искате да стартирате. правилно Стартиране на програматаизглежда нещо подобно:

Стартирайте "" "C:\Program Files\Microsoft
OfficeOffice11Winword.exe"

Не можеш да предвидиш всичко

Скриптовете на обвивката Cmd.exe са широко използвани. Като следвате съветите в тази статия, можете да създадете по-стабилни скриптове и да избегнете често срещани проблеми.

Създайте скриптове за включване/изключване и влизане/излизане

Припомнете си, че в Windows XP/2000/NT профилите (локални и сървърни) се използват за конфигуриране на потребителската среда, които включват всички конфигурирани от потребителя параметри: език и регионални настройки, настройки на мишката и звука, картографирани мрежови устройства и принтери и др. Профилите, съхранявани на сървъра, предоставят на потребителите една и съща работна среда, независимо от кой компютър (работващ Windows) е влязъл потребителят. Създаването и поддържането на потребителски профили е описано в почти всяка книга по Администриране на Windowsи няма да се разглеждат тук.

Започвайки с Windows NT, в допълнение към профилите, потребителските среди се конфигурират чрез скриптове за влизане (скриптове за влизане)- WSH скриптове, пакетни или изпълними файлове, които се изпълняват на машината на потребителя всеки път, когато той влезе в мрежата или локално работна станция. Това позволява на администратора да зададе само някои от настройките на средата на потребителя, без да се намесва в други настройки; освен това, скриптовете за влизане са по-лесни за създаване и поддържане от профилите.

В Windows XP/2000 следните типове скриптове могат да бъдат допълнително зададени за GPO.

? Сценарии за включване, които се изпълняват автоматично при стартиране на операционната система и преди регистрация на потребител.

? Скриптове за влизане с групови правила, които се изпълняват автоматично, когато потребител влезе, и преди да стартирате нормалния скрипт за влизане, споменат по-горе за този потребител.

Скриптове за излизане, които се изпълняват автоматично, когато сесията на потребителя приключи.

? Сценарии за изключванекоито се изпълняват автоматично, когато Windows се изключи.

За по-лесно тестване на примерите, сега ще разгледаме скриптовете за включване/изключване и влизане/излизане, които се съхраняват на локална работна станция с Windows XP. По-долу ще бъде описано подробно в кои специални папки трябва да записвате скриптове от един или друг вид и как са свързани тези скриптове. За да използвате скриптове за включване/изключване и влизане/излизане в мрежата с услугата Active DirectoryДиректория, просто трябва да прехвърлите скриптовете в съответните папки на контролера на домейна и да използвате щракването Active Directory – потребители и компютри(Active Directory - потребители и компютри) конзоли MMC контролиза да присвоите тези скриптове на съответните GPO.

Скриптове, които се изпълняват при стартиране на операционната система

Скриптовете за включване/изключване, като скриптове за влизане/излизане на групови правила, се свързват с помощта на добавка Групова политика(Групова политика) в MMC. Процесът на добавяне на приставка Групова политика(Групова политика) за локалната работна станция е описана подробно в сек. „Заключване на локално и отдалечени скриптове WSH. Пример за административен шаблон" глава 4(фиг. 11.8).

Ориз. 11.8.Съветник за групови правила

За да свържете конкретен скрипт за включване, трябва да изберете секцията Конфигурация Компютър|Конфигурация на Windows|Скриптове (Стартиране/Изключване)(Computer Configuration | Windows Configuration|Scripts (Startup/Shutdown)) и изберете свойството (Startup), след което ще се покаже диалоговият прозорец (Properties: Startup) (фиг. 11.9).

Ориз. 11.9.Списък на инсталираните скриптове за активиране

Добавете(Добавяне) и в диалоговия прозорец Добавяне на скрипт(Добавяне на скрипт) посочете име желания файл(за това можете да използвате бутона Общ преглед(Преглед)) и, ако е необходимо, параметри на скрипта (фиг. 11.10).

Имайте предвид, че по подразбиране скриптовете за активиране се съхраняват в директорията %SystemRoot%\System32\GroupPolicy\Machine\Scripts\Startup.

Ориз. 11.10.Активирайте името и параметрите на скрипта

Скриптове, които се изпълняват при изключване на операционната система

За да свържете скриптове за изключване, трябва да изберете свойството Изключвам(Изключване). Сценарии (Старт/Изключване)(Скриптове (Стартиране/Изключване)), след което ще се покаже диалогов прозорец Свойства: Изключване(Свойства: Изключване) (фиг. 11.11).

Ориз. 11.11.Списък на инсталираните скриптове за изключване

Както в предишния случай, за да добавите нов сценарий, трябва да щракнете върху бутона Добавете(Добавяне) и в диалоговия прозорец Добавяне на скрипт(Добавяне на скрипт) посочете името на необходимия файл (по подразбиране скриптовете за изключване се съхраняват в директорията %SystemRoot%\System32\GroupPolicy\Machine\Scripts\Shutdown) и параметрите на скрипта.

Скриптове за влизане за всички местни потребители

Скриптовете за влизане с групови правила са включени под Потребителска конфигурация|Конфигурация на Windows|Скриптове (вход/излизане)(Потребителска конфигурация|Конфигурация на Windows|Скриптове (влизане/излизане)). В този раздел трябва да изберете имот Влизане(Влизане), след което ще се покаже диалогов прозорец Свойства: Вход(Свойства: Logon) (фиг. 11.12).

За да добавите нов скрипт за влизане, щракнете върху бутона Добавете(Добавяне) и в диалоговия прозорец Добавяне на скрипт(Добавяне на скрипт) посочете името на необходимия файл (по подразбиране скриптовете за изключване се съхраняват в директорията %SystemRoot%\System32\GroupPolicy\User\Scripts\Logon) и параметрите на скрипта.

Ориз. 11.12.Списък с инсталирани скриптове за влизане

Скрипт за излизане за всички местни потребители

За да свържете изходни скриптове, трябва да изберете свойството Отписване(Изход). Сценарии (вход/излизане)(Скриптове (Влизане/Излизане)), след което ще се покаже диалогов прозорец Свойства: Изход(Свойства: Излизане) (фиг. 11.13).

За да добавите нов скрипт, щракнете върху бутона Добавете(Добавяне) и в диалоговия прозорец Допълнениескрипт (Добавяне на скрипт) указва името на желания файл (по подразбиране скриптовете за излизане се съхраняват в директорията %SystemRoot%\System32\GroupPolicy\User\Scripts\Logoff) и параметрите на скрипта.

Ориз. 11.13.Списък на инсталираните изходни скриптове

Скрипт за влизане за един потребител

Скриптовете за влизане за отделни потребители се задават с помощта на добавката (локални потребители и групи).

Коментирайте

В Windows NT това беше направено с помощта на User Manager (User Мениджър задомейн).

За да добавите тази добавка в MMC конзолата, изберете елемента Добавете или премахнете снимка(Добавяне/Премахване на Snap-in) в менюто Конзола(Конзола) и натиснете бутона Добавете(Добавяне). В списъка с всички налични приставки, който се показва, изберете елемента Местни потребители и групи(Локални потребители и групи) и щракнете върху бутона Добавете(Добавяне). След това ще се появи диалогов прозорец, в който трябва да посочите, че избраната приставка ще управлява локалния компютър, и щракнете върху бутона Готов(Край) (фиг. 11.14).

Ориз. 11.14.Избиране на компютъра, който ще управлява добавката Местни потребители и групи

Няма да добавяме никакви други приставки към прозореца на конзолата, така че натискаме бутона близо(Затваряне) в списъка с приставки и бутон Добрев прозореца за добавяне/премахване на приставки. След това можем да видим списъка с потребители на локални компютри в прозореца на конзолата и да променим техните свойства (фиг. 11.15).

Ориз. 11.15.списък с потребители локален компютър

За да зададете скрипт за влизане на потребител, изберете този потребител (например Попов) в списъка и отидете на раздела Профил(Профил) в диалоговия прозорец със свойства на потребителя. Името на скрипта за вход се въвежда в полето Скрипт за влизане(Logon Script) на този прозорец (фиг. 11.16).

Ориз. 11.16.Настройки на потребителския профил

Пътят на скрипта за вход трябва да е относителен към директорията %SystemRoot%\System32\Repl\Import\Scripts. Ако, да речем, скриптът scr99.bat за потребителя Popov се намира в директория с пълно квалифицирано име F:\Windows\System32\Repl\Import\Scripts\Script99, тогава \Script99\scr99.bat трябва да се посочи като път до скрипта за влизане.

Примерни скриптове за влизане/излизане

По-долу са дадени няколко скрипта (два от които са нормални пакетни файлове), които могат да се използват като скриптове за влизане или излизане.

Връзка мрежови устройстваи синхронизация на времето при регистриране на потребители

Скриптовете за влизане често се използват за свързване на принтерни устройства и портове към мрежови ресурси и за синхронизиране на системното време на потребителските компютри с Системно времеконкретен сървър (това е необходимо например за банкови системи на файлов сървър в реално време). Разбира се, можете да напишете WSH скрипт за тази цел, но в подобни случаипо-лесно е да се ограничите до обикновен пакетен (партиден) файл. Имайте предвид, че в пакетните файлове можете да използвате различни помощни програми на командния ред от Windows пакети NT/2000/XP Resource Kit, с който много задачи могат да бъдат решени най-бързо и по прост начин. Като пример ще посочим само един полезна команда IFMEMBER , който позволява, без да се прибягва до помощта на ADSI, да се провери дали потребителят, извършващ регистрацията, принадлежи към определена група.

Коментирайте

За тези, които искат да научат повече за възможностите на пакетните файлове в Windows и командите, които те използват, можете да препоръчате предишната ми книга.

Да приемем, че когато регистрираме конкретен потребител, трябва да произведем следните действия:

1. Синхронизирайте системното време на клиентската работна станция със системното време на Server1.

2. Свържете устройство M: към мрежовия ресурс \\Server1\Letters.

3. Предоставете директорията C:\TEXT на клиентски компютър v обща употребанаречени КНИГИ.

За да направите това, потребителят може да бъде назначен като скрипт за влизане партиден файл Logon.bat, който (включително коментарите) е дълъг само шест реда (листинг 11-9).

Списък 11.9. Пример за скрипт за влизане

REM Име: Logon.bat

REM Описание: Използване на пакетен файл като скрипт за влизане

NET TIME \\Server1 /SET

NET SHARE MyTxt=C:\TEXT

В първия ред на файла Logon.bat деактивираме режима на дублиране на команди на екрана:

Времевата синхронизация със сървъра \\Server1 се извършва с помощта на превключвателя /SET в командата NET TIME:

NET TIME \\Server1 /SET

мрежово устройствосвързан с командата NET USE:

NET USE M: \\Server1\Letters /PSISTENT:NO

Ключ /PERSISTENT : NO в командата NET USE е необходимо за създаване на временни връзки (които не се запазват след края на сесията на потребителя). Ако връзките бяха постоянни (/PERSISTENT:YES), тогава следващия път, когато потребителят влезе, ще възникне грешка ( повторна употребасъществуваща връзка).

И накрая, папката C:\TEXT се споделя с командата NET SHARE:

NET SHARE MyTxt=C:\TEXT

Интерактивен избор на стартиращи програми

Както знаете, в подменюто Програми(Програми) начална страница менюто на windowsима елемент (Стартиране), в който можете да поставите преки пътища към онези програми, които трябва да се стартират автоматично, когато потребител влезе в системата. Въпреки това, в процеса на зареждане на своя профил, потребителят няма възможност да стартира само всеки определени програмиот папката за стартиране - можете или да стартирате всички програми, или да не стартирате нито една (за това трябва да задържите клавиша по време на регистрация в системата ).

Ще напишем скрипт Logon.js, който ще позволи на потребителя да избере кои програми да стартира при влизане; Като присвоим този скрипт като скрипт за влизане с групови правила, ние ще направим процеса на стартиране на приложението интерактивен.

Ще започнем със създаване в директорията %SystemDrive%\Documents and Settings\All Users \ Главното меню, което съхранява преки пътища за програми от стартовото меню за всички потребители, папка и поставя преки пътища за необходимите приложения там (фиг. 11.17).

След това преки пътища от обикновена папкатрябва да бъдат премахнати. Нека сега да разгледаме как работи скриптът за влизане в Logon.js.

Първо трябва да дефинирате пътя до папката за селективно стартиране (променлива PathStartup). За да направим това, ще използваме обекта WshSpecialFolders:

// Създайте обект на WshShell

Ориз. 11.17. нова папка

Знаейки пътя до желаната папка, ние формираме колекция от всички файлове, които се намират в нея (променливата Files):

След това показваме диалогов прозорец, който пита дали трябва да стартираме програми от папката за стартиране в пакетен режим, т.е. всичко наведнъж (фиг. 11.18).

Ориз. 11.18.Избор на режим на стартиране на програмата (партиден или интерактивен)

В зависимост от бутона, натиснат в диалоговия прозорец, ние присвояваме булева стойност на променливата IsRunAll, която определя режима на стартиране на програмите (ако IsRunAll е false , тогава всяка програма ще бъде подканена да я стартира, в в противен случайвсички програми стартират без предупреждение):

Res=WshShell.Popup("Стартиране на всички програми наведнъж?", 0,

//Определете дали бутонът "Да" е натиснат

докато (!Files.atEnd()) (

File=Files.item();

Files.moveNext();

Ако преди това е избран интерактивният режим на стартиране на програми (променливата IsRunAll е false), тогава показваме заявка за стартиране на текущия файл (фиг. 11.19):

//Нулиране на променлива Res Res=0;

Res=WshShell.Popup("Стартиране "+File.Name+"?", 0, "Селективно стартиране", vbQuestion+vbYesNo);

Ориз. 11.19.Заявка за стартиране на една програма от папката за стартиране

Ако потребителят реши да стартира програмата (променливата Res е равна на vbYes) или програмите се стартират в пакетен режим, тогава стартираме текущата програмав минимизиран прозорец, използвайки метода Run на обекта WshShell:

ако ((IsRunAll) || (Res=vbYes))

WshShell.Run("\""+File.Path+" \"", vbMinimizedFocus);

Тъй като пълното име на програмата, която се изпълнява, може да съдържа интервали, името трябва да бъде затворено в двойни кавички с помощта на escape последователността \".

Коментирайте

Друга възможност за стартиране на програми, чиито имена съдържат интервали с помощта на метода Run, е да използвате кратки именапапки и файлове чрез свойството ShortPath на обекта File: WshShell.Run(File.ShortPath, vbMinimizedFocus);

Пълният текст на скрипта Logon.js е показан в листинг 11-10.

Списък 11.10. Скрипт за влизане, който ви позволява да избирате програми, които да стартират автоматично

//*******************************************************************/

/* Име: Logon.js */

/* Език: JScript */

/* Описание: Скрипт за влизане, който ви позволява да избирате програми за */

/* автоматично зареждане */

/*******************************************************************/

//Деклариране на променливи

PathStartup, //Път към персонализираната папка за стартиране

Папка, //Екземпляр на обекта Folder за папката

// селективно автоматично зареждане

Файлове, // Колекция от файлове в папката за селективно стартиране

Файл, //Екземпляр на обекта File за прекия път в папката

// селективно автоматично зареждане

Res, //Резултатът от натискане на бутони в диалоговите прозорци

IsRunAll; // Булев флаг, указващ дали да се стартира

//незабавно всички програми от стартиране

var vbYesNo=4,vbQuestion=32,vbYes=6,vbOkOnly=0,vbMinimizedFocus=2;

// Създайте обект на WshShell

WshShell=WScript.CreateObject("Wscript.Shell");

//Създаване на обект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определете пътя до селективната стартираща папка

PathStartup=WshFldrs.item("AllUsersStartMenu")+"\\Custom Startup\\";

//Създаване на обект FileSystemObject

FSO=WScript.CreateObject("Scripting.FileSystemObject");

//Създаване на обект Folder за селективната стартираща папка

Папка=FSO.GetFolder(PathStartup);

//Създаване на колекция от селективни файлове на директория за автоматично зареждане

Файлове=нов преброител(папка.файлове);

//Показване на заявка за стартиране на всички програми наведнъж

Res=WshShell.Popup("Стартиране на всички програми наведнъж?",0,

//Определете дали бутонът Да е натиснат

IsRunAll=(Res==vbYes);

//Преглеждане на всички файлове в селективната директория за автоматично зареждане

докато (!Files.atEnd()) (

//Създаване на обект File за текущия елемент от колекцията

File=Files.item();

//Нулиране на променлива Res

if (!IsRunAll) //Програмите трябва да се изпълняват една по една

//Показване на заявка за стартиране на една програма

Res=WshShell.Popup("Изпълни "+File.Name+"?",0,

if ((IsRunAll) || (Res==vbYes))

//Стартирайте текущата програма в минимизиран прозорец

WshShell.Run("\""+File.Path+"\"",vbMinimizedFocus);

//Отиди на следващия файлв колекцията

Files.moveNext();

Архивиране на потребителски документи в края на сесия

За всеки потребител на Windows XP автоматично се създава лична папка в директорията Documents and Settings, чието име е същото като името на потребителя. Поддиректорията My Documents на тази папка съхранява всички документи, създадени от потребителя по подразбиране. За да имате винаги резервно копие на документите на потребителите, можете да напишете общ скрипт за излизане, който ще копира всички файлове и поддиректории от директорията "Моите документи" на потребителя в друга директория с името на потребителя. В нашия пример резервните копия на документи ще бъдат записани в директорията D:\Backup, т.е. когато потребителят Popov излезе, всичките му документи ще бъдат копирани в директорията D:\Backup\Popov, а когато потребителят Kazakov излезе, те ще бъдат копирани в директорията D:\Backup\Kazakov.

партиден файл

от най-много бърза поправкаЗадачата е да създадете пакетния файл Logoff.bat (листинг 11-11) и да го зададете като скрипт за излизане за всички потребители. Резултатът от този пакетен файл ще бъде видим в командния прозорец (фиг. 11.20).

Списък 11.11. Команден файл с изходен скрипт, който ви позволява да: архивиранепотребителски документи

REM Име: Logoff.bat

REM Описание: BAT файл, който извършва архивиране

REM потребителски документи

ECHO Край на сесията за потребител %UserName%.

ECHO Започнете да копирате документи в D:\Backup\%UserName%...

XCOPY /C /D /E /I /Y "%HomeDrive%%HomePath%\My Documents" D:\Backup\%UserName%

ECHO Копирането на документ завършено.

Както виждаме, цялата работа на файла Logoff.bat е да извика командата XCOPY за необходимите директории:

XCOPY /C /D /E /I /Y "%HomeDrive%%HomePath%\My Documents" "D:\Backup\%UserName%"

Ориз. 11.20.Резултат от изходния скрипт Logoff.bat за потребител Попов

Тук за XCOPY са посочени няколко ключа, които позволяват:

Не прекъсвайте копирането, когато възникне грешка (превключете /C);

Копирайте само тези файлове, които са били променени (превключвател /D);

Копирайте всички поддиректории, включително празните (превключвател /E);

Създайте, ако е необходимо, директорията, към която се прави копието (ключ /I);

Презаписване на файлове без потвърждение от потребителя (превключвател /Y).

Коментирайте

За повече информация относно командните превключватели XCOPY вижте вградената помощ за тази команда. За да покажете тази помощ на екрана, трябва да стартирате XCOPY в командния прозорец с /? ; за да изведете помощ към текстов файл, трябва да използвате символа за изходно пренасочване " > ", например: XCOPY /? > spr.txt .

Пътищата до директорията, където се съхраняват документите на потребителя, и до директорията, в която ще бъде направено копието, се формират с помощта на променливите на средата %HomeDir%, %HomePath% и %UserName%. Описание на тези и някои други променливи на средата, които са дефинирани в Windows, е дадено в Таблица 1. 11.2.

Таблица 11.2.Променливи на средата, полезни за скриптове за влизане/излизане

Променлива Описание
%COMSPEC% Начин да се команден интерпретатор
%HOMEDIR% Заменена буква на устройството на компютъра на потребителя, която се отнася до мрежовото споделяне, съдържащо личната директория на потребителя
%HOMEDRIVE% Локалното или пренасочено устройство, на което се намира личната директория
%HOMEPATH% Път към личната директория
%HOMESHARE% Име на директория публичен достъп, включително лична директория и локално или отменено устройство
%ОПЕРАЦИОННА СИСТЕМА% Операционната система, която управлява работната станция
%PROCESSOR_ARCHITECTURE% Архитектура на процесора (например x86) на работната станция на потребителя
%SYSTEMDRIVE% Устройството, което съдържа системната директория на Windows
%SYSTEMROOT% Начин да се системна директория Windows
%PROCESSOR_LEVEL% Тип процесор на потребителска работна станция
%TEMP% Път до директорията за съхранение на временни файлове
%USERDOMAIN% Домейнът, в който е регистриран потребителят
%USERNAME% Името, под което е регистриран потребителят при влизане в мрежата

Тъй като имената на директориите, които се появяват в командата XCOPY, могат да съдържат интервали, тези имена са затворени в кавички.

WSH скрипт

За да създадем резервните копия, от които се нуждаем, можем също да напишем WSH скрипт (да наречем този скрипт Logoff.js), който, разбира се, ще бъде много по-голям от пакетния файл, но ще показва съобщения в красиви графични диалогови прозорци (фиг. 11.21-11.23).

Първо, обектите WshShell, FileSystemObject и WshSpecialFolders се инстанцират в скрипта Logoff.js, а след това променливата SHomePath се задава на пътя към директорията на документа текущия потребител (специална папкаиме Моите документи):

// Създайте обект на WshShell

//Създаване на обект FileSystemObject

//Създаване на обект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определете пътя до селективната стартираща папка

Пътят до директорията, в която ще бъдат копирани документите, се формира с помощта на променливата на средата %UserName%; стойността на такава променлива се извлича с помощта на метода ExpandEnvironmentStrings() на обекта WshShell:

// Дефиниране на потребителското име

//потребител

SBackupPath+=SUserName;

Ще копираме документи само след като потребителят отговори утвърдително на съответния въпрос (виж фиг. 11.21):

Res=WshShell.Popup("Архивиране на документи в\n" + SBackupPath + " ?", 0, "Изход потребител " + SUserName, vbQuestion+vbYesNo);

Ориз. 11.21.Диалогов прозорец с въпрос дали искате да копирате

Ако потребителят се съгласи, ние копираме желаната директория с помощта на метода CopyFolder() и правим това в блока try на конструкцията try...catch.

Ако възникне грешка, променливата IsError в блока catch е настроена на true и се показва диалогов прозорец със съответното съобщение (вижте Фигура 11.22):

catch (e) ( // Обработка на възможни грешки

//Показване на съобщение за грешка

Mess="Грешка при копиране на директория "+SHomePath+"\nКод на грешка: " + e.number + "\nОписание: " + e.description;

WshShell.Popup(Mess, 0, "User Exit" + SUserName, vbCritical);

Ориз. 11.22.

Ако не са възникнали грешки по време на копирането (променливата IsError е false), тогава на потребителя също се дава съобщение за това (вж. Фиг. 11.23):

//Правим копие на директорията

FSO.CopyFolder(SHomePath, SBackupPath);

//Всичко е наред

Mess = "Документите са копирани";

WshShell.Popup(Mess, 0, "User Exit" + SUserName, vbInformation);

Ориз. 11.23.Диалогов прозорец за грешка

Пълният текст на скрипта Logoff.js е показан в листинг 11-12.

Списък 11.12. JScript изходен скрипт за архивиране на потребителски документи

/* Име: Logoff.js */

/* Език: JScript */

/* Описание: Изходен скрипт, който позволява архивиране */

/* копиране на потребителски документи */

/********************************************************************/

//Деклариране на променливи

WshShell, //Екземпляр на обекта WshShell

WshFldrs, // Инстанция на обекта WshSpecialFolders

FSO, // екземпляр на обекта FileSystemObject

SUserDocPath, //Път до папката с документи на потребителя

SUserName, //Потребителско име

SBackupPath="D:\\Backup\\", //Директория за архивиране на документи

//Инициализиране на константи за диалогови прозорци

var vbYesNo=4,vbQuestion=32,vbInformation=64,vbYes=6,vbOkOnly=0,

// Създайте обект на WshShell

WshShell = WScript.CreateObject("WScript.Shell");

//Създаване на обект FileSystemObject

FSO = WScript.CreateObject("Scripting.FileSystemObject");

//Създаване на обект WshSpecialFolders

WshFldrs=WshShell.SpecialFolders;

//Определете пътя до селективната стартираща папка

SHomePath=WshFldrs.item("Моите документи");

// Дефиниране на потребителското име

SUserName=WshShell.ExpandEnvironmentStrings("%UserName%");

// Генериране на пълния път до директорията с резервни копия на документи

//потребител

SBackupPath+=SUserName;

// Заявка за създаване архивиране

Res=WshShell.Popup("Архивиране на документи в\n"+

SBackupPath+" ?", 0, "Изход потребител "+SUserName, vbQuestion+vbYesNo);

if (Res==vbYes) ( //Натиснат бутон Да

//Правим копие на директорията

FSO.CopyFolder(SHomePath,SBackupPath);

) catch (e) ( // Обработка на възможни грешки

//Показване на съобщение за грешка

Mess="Грешка при копиране на директория "+SHomePath+"\nКод на грешка: "+

e.number+"\nОписание: "+e.description;

WshShell.Popup(Mess,0,"Изход на потребителя "+SUserName,vbCritical);

//Всичко е наред

Mess="Документите са копирани";

WshShell.Popup(Mess,0,"Изход на потребителя "+SUserName,vbInformation);

/************* Край *********************************** **********/

Третият тип команди в PowerShell са скриптове. Скриптът е блок от код, съхранен в отделен файлс разширение .ps1. Това е основното предимство на скриптовете, тъй като можете да запазвате код, без да се налага да го въвеждате ръчно всеки път.

Скриптовете могат да бъдат написани във всеки текстов редактор, основното е да запазите написаното във файл с разширение .ps1. Скриптът може да бъде написан и в конзолата, след което да се копира текста в редактора и да се запази. Междувременно PowerShell вече има интегрирана среда за скриптове (IDE), която улеснява писането.

Важно е!

По подразбиране скриптовете не са разрешени в системата. Това е от съображения за сигурност, тъй като скриптовете могат да съдържат блокове от злонамерен код.

Можете да проверите дали изпълнението на скрипта е деактивирано за вас с командата

Get-ExecutionPolicy
Проверка на политиката за сигурност в Windows PowerShell

Ако имате строга политика за сигурност на ниво Restricted или AllSigned, тогава ще трябва да я промените с командата

Set-ExecutionPolicy RemoteSigned

Сега нека напишем първия си скрипт. За да пишем скриптове, ще използваме Windows PowerShell ISE, прозорецът, с който вече сте виждали на екранната снимка по-горе. Нека напишем текст в горния прозорец

Сега нека стартираме нашия файл. За да направите това, отидете в директорията с файла с командата

CDC:\

и бягай

.\грунд

Имайте предвид, че точката е важна, защото показва, че файлът трябва да се стартира от текущата директория.


Примерно изпълнение на скрипт в Windows PowerShell

Разбира се, не е необходимо да отивате в директорията с файла. Можете също така просто да напишете целия път до файла.

Скриптът може да се стартира и от нормален команден ред на Windows (не Windows PowerShell). За да направите това, добавете параметъра powershell.exe преди пътя към файла на скрипта. Например в моя случай

powershell.exe C:\primer.ps1

Когато става въпрос за код, скриптовете са по същество същите като функциите. Съществената разлика, която трябва да имате предвид, когато пишете скриптове, е, че формалните параметри не могат да бъдат посочени просто в скоби. За да зададете формалните параметри, трябва да използвате специална инструкцияпарам. Тази инструкция трябва да бъде поставена най-отгоре на скриптовия файл (може да има само празни редове и коментари по-горе).

Нека променим нашия начален файл, както е показано на фигурата по-долу.


Формални параметри в скриптовете на Windows PowerShell

Както можете да видите, след стартиране на скрипта с аргументи, той се изпълни необходимо действиедопълнение.

Дотолкова доколкото PowerShell скриптовев много отношения подобни на редовете код в класическите езици за програмиране, те също са форматирани с коментари. Коментарите в скриптовете на Windows PowerShell са форматирани със символа # .

# Това е коментар # Това също е коментар # в скрипт на Windows PowerShell ##############################################

Така че, както можете да видите, Windows PowerShell има своя собствена скриптов език. Нека поговорим за последния тип команди.

Категория ~ Технически съвети – Игор (администратор)

Искали ли сте някога да стартирате програма или скрипт, когато компютърът е изключен или когато потребителят излезе? В края на деня извикайте програма за почистване на временни файлове или стартирайте архивиране на редовно използвани файлове. Въпреки че е достатъчно лесно да стартирате програма автоматично при стартиране на Windows, настройването на програмите да стартират при изключване не е толкова лесно. Малко потребители са наясно с това, но много версии на Windows имат вграден инструмент, който ви позволява да направите това съвсем просто.

Редактор на локални групови правила на Windows

Номерът е да използвате системата инструмент за windowsнаречен редактор на локални групови политики (GPE). За съжаление, Microsoft изключи GPE от всички Домашни версии, така че този метод се прилага само за професионални и корпоративни издания. Методът е подходящ за Windows XP и по-нови версии. Може би вече сте запознати с GPE, т.к този инструментпредставлява набор удобни функции. Въпреки това, дори и в този случай, малко хора знаят за възможността за стартиране на скриптове и програми.

Забележка: Като алтернатива винаги можете да използвате vbs скриптове или пакетни файлове, които ще завършат с конзолна команда за изключване на компютъра.

GPE е един от системните модули на Windows, известен като конзола за управление на Microsoft или добавка. Въпреки че някои от тях могат да бъдат стартирани от панела Контроли на Windows, не можете да ги намерите в списъците с програми. Имайте предвид, че ще ви трябват администраторски права, за да стартирате приставките.

Изпълнете скрипт или програма, когато Windows се изключи


Изпълнете скрипт или програма, когато потребител излезе от Windows

Ако трябва да стартирате програма или скрипт само когато потребителят излезе, тогава трябва да използвате различен елемент в приставката на GPE. Самите инструкции остават абсолютно същите. Единственото нещо, което трябва да направите в стъпка 3, е да отворите раздела "Потребителска конфигурация" вместо раздела "Конфигурация на компютъра". И в стъпка 4 щракнете двукратно върху „Изход“ вместо „Изключване“

Забележка: Тази статия е повече за опитни потребители. Допълнителна информацияотносно използването и планирането чрез GPE можете да намерите на уебсайта на Microsoft на тази връзка.

Сега знаете как да стартирате изпълним файл, когато Windows се изключи и когато потребителят излезе.

Можете да стартирате скрипта от командния ред, като използвате WSH конзолната версия на cscript.exe. Например, за да стартирате скрипт, написан във файла C:\Script\First.js, трябва да заредите команден прозорец и да изпълните командата в него

cscript C:\Script\First.js

Този скрипт ще отпечата низа "Здравей!"( ориз. 4.1)

уголемяване на изображението Ориз. 4.1.Резултатът от изпълнение на First.js в конзолен режим (cscript.exe)

Изпълнете скрипт от командния ред в графичен режим

Скриптът може да се стартира от командния ред с помощта на графичната версия на WSH (windows) на wscript.exe. В нашия пример в този случай трябва да изпълните командата

wscript C:\Script\First.js

След това, в резултат на изпълнението на скрипта, диалоговият прозорец, от който се нуждаем, ще се появи на екрана ( ориз. 4.2).

уголемяване на изображението Ориз. 4.2.Резултатът от изпълнението на First.js в графичен режим (wscript.exe)

Така виждаме, че когато скриптът се изпълнява в конзолен режим, текстовата информация се извежда към стандартния изходен поток (към екрана), докато когато се изпълнява в графичен режим, се извежда в диалоговия прозорец.

Изпълнение на скрипт с помощта на менюто "Старт".

За да стартирате скрипт с помощта на елемента Изпълнение от менюто "Старт", просто напишете пълно иметози скрипт в полето Отвори и щракнете върху бутона OK. В този случай по подразбиране скриптът ще се изпълнява с помощта на wscript.exe, т.е. информацията ще се показва в графичен диалогов прозорец.

Изпълнение на скрипт с помощта на Windows Explorer (Windows Explorer)

Най-простият е да стартирате скрипта в Windows Explorer или на работния плот - просто щракнете двукратно върху името на файла на скрипта или върху неговата икона (подобно на всеки друг изпълним файл). В този случай, както и в случай на стартиране с помощта на менюто "Старт" (Старт), скриптът по подразбиране се изпълнява с помощта на wscript.exe.

Настройка и промяна на свойствата на скрипта

Ако е необходимо, можете да зададете различни параметри за скриптове, които влияят върху хода на тяхното изпълнение. Тези параметри се задават различно за конзолната (cscript.exe) и графичната (wscript.exe) версии на Script Server.

Ако скриптът се изпълнява в конзолен режим, тогава неговото изпълнение се контролира от опциите на командния ред за cscript.exe (вижте по-долу). раздел. 4.1), които активират или деактивират различни WSH опции (всички от които започват с "//").

Таблица 4.1. Опции на командния ред за cscript.exe

Описание на параметъра

Изключва пакетния режим (по подразбиране). В този случай всички съобщения за грешки в скрипта ще бъдат показани на екрана.

Активира пакетен режим. Това няма да показва никакви съобщения на екрана.

Указва времето за изчакване в секунди, т.е. скриптът ще се изпълнява за nn секунди, след което процесът ще бъде прекратен. По подразбиране времето за изпълнение е неограничено.

Отпечатва (по подразбиране) версия на WSH и информация за разработчика преди изпълнение на скрипта

Потиска версията на WSH и извеждането на информация за разработчиците

//H:CScipt или //H:Wscript

Прави cscript.exe или wscript.exe приложение за скриптове по подразбиране. Ако тези параметри не са посочени, по подразбиране се приема wscript.exe.

Съхранява настройките на командния ред за текущия потребител

Показва вградена подсказка за опции на командния ред

Изпълнява скрипта с помощта на модула, определен от параметъра на двигателя

Включва дебъгер

Изпълнява програмата в дебъгера

//Работа:

Започва работа с индекс JobID от многозадачен WS файл (структурата на WS файловете ще бъде описана по-долу)

Позволява ви да използвате Unicode при пренасочване на I/O от конзолата

Например командата

cscript //Nologo C:\Script\First.js

ще стартира скрипта First.js без информация за версията на WSH.

Скрипт може да се изпълнява с опции от командния ред, които са посочени след името на скрипта (процедурата за работа с такива опции ще бъде описана по-долу, когато се разглеждат обектите WshArguments, WshNamed и WshUnnamed). Например командата

cscript //B C:\Script\First.js /a /b

ще стартира скрипта First.js в пакетен режим, с /a и /b като опции за този скрипт и //B като опция за приложение за cscript.exe.

Ако скриптът се изпълнява в графичен режим (с помощта на wscript.exe), тогава свойствата на скрипта могат да бъдат зададени с помощта на раздела Script на диалоговия прозорец, който задава свойствата на файла в Windows ( ориз. 4.3).

Ориз. 4.3.Задаване на свойства на скрипта First.js

След задаване на свойствата на скрипт, автоматично се създава файл с името на този скрипт и разширението wsh, което има структура, подобна на ini файл, например:

Път=C:\Script\First.js

Ако щракнете двукратно върху Windows Explorer wsh файл или стартирайте такъв файл от командния ред, тогава съответният сървър на скриптове (wscript.exe или cscript.exe) ще изпълни скрипта, на който отговаря wsh файлът, с параметрите, посочени в секцията Опции.

Когато изпълнявате скриптове с помощта на wscript.exe, технологията на плъзгане и пускане може да се използва за задаване на параметри на командния ред на скрипта - ако изберете няколко файла в Windows Explorer и ги плъзнете към прекия път на скрипта, този скрипт ще се стартира и имената на избраните файлове ще бъдат прехвърлени към него като параметри.