Установка переменных среды в файле vbs
Я пишу пакетный файл Windows и хочу скопировать что-то на рабочий стол. Я думаю, что могу использовать это:
однако, я думаю, что, вероятно, будет работать только на английской ОС. Есть ли способ сделать это в пакетном файле, который будет работать в любой интернационализированной версии?
обновление
я попробовал следующий пакетный файл:
могут быть и другие решения, но я лично считаю это менее хакерским.
Я тестировал это на английском ПК, а также на французском ПК - кажется, работает (Windows XP).
чтобы быть в безопасности, вы должны использовать правильные API в Powershell (или VBScript)
С Помощью PowerShell:
скопируйте что-нибудь с помощью Powershell:
вот VBScript-пример, чтобы получить путь к рабочему столу:
по крайней мере, в Windows XP, Vista и 7 вы можете использовать "%UserProfile%\Desktop" безопасно.
Windows XP en-US он будет расширяться до "C:\Documents and Settings\YourName\Desktop"
Windows XP pt-BR он будет расширяться до "C:\Documents and Settings\YourName\Desktop"
Windows 7 en-US он будет расширяться до "C:\Users\YourName\Desktop"
Windows 7 pt-BR он будет расширяться до "C:\Usuarios\YourName\Desktop"
на XP вы не можете использовать это для других папок, кроме настольных My documents обращаясь к Meus Documentos и Local Settings to Configuracoes locais Personaly я думаю, что это плохо, когда проецирование ОС.
ответ КБ для использования [Environment]::GetFolderPath("Desktop") , очевидно, является официальным API Windows для этого.
однако если вы работаете в интерактивном режиме в командной строке, или просто хотите что-то, что работает на вашем компьютере, Тильда (~) символ обозначает домашнюю папку текущего пользователя. Так что ~/desktop в папке рабочего стола пользователя.
мало того, что это не будет работать для международной версии Windows, это не удастся, если пользователь отредактировал реестр, чтобы сделать их папку рабочего стола находиться где-то еще. Вы можете запросить реестр для расположения файла с помощью :
чтобы получить это в переменную, используйте что-то вроде этого:
в Windows 7 возвращает путь к рабочему столу:
таким образом, он успешно анализирует ключ REG, но если ключ содержит встроенный %var%, он не переводится во время команды копирования.
У меня была аналогичная проблема (и VBScript или PowerShell не были опцией), и код, который я нашел в этой статье, не работал для меня. У меня были проблемы с версиями ОС и языках. После некоторых экспериментов я пришел к этому решению:
этот код работает для меня на английском и польском языках Windows 7 и Windows XP.
подпрограмма :reparse допускает отложенное расширение переменных среды.
хотя я понимаю, что это немного старый пост, я думал, что это может помочь людям в подобной ситуации. Я сделал быструю одну строку VBScript, чтобы вытащить информацию для любой специальной папки, которую вы хотели бы (без проверки ошибок), и она работает следующим образом:
создайте файл " GetShellFolder.vbs " со следующей строкой:
Я всегда копирую cscript.exe (32-разрядная версия) в ту же папку, что и пакетный файл, из которого я запускаю это, я предполагаю, что вы делая то же самое (у меня были ситуации, когда пользователи каким-то образом удалили C:\Windows\system32 с их пути или удалось избавиться от cscript.exe, или он заражен или иным образом не работает).
теперь скопируйте файл для копирования в ту же папку и создайте там пакетный файл со следующими строками:
Ну и для тех, кто не знает "%~dp0" - это просто каталог, из которого вызывается скрипт. Он работает и для UNC-путей, что делает пакетный файл используя его чрезвычайно портативный. Это специально заканчивается трейлингом"\", хотя на первый взгляд это может выглядеть немного странно.
ответ@Dave Webb, вероятно,путь. Единственное, что я могу придумать, это списки csidl:
CSIDL_DESKTOPDIRECTORY
каталог файловой системы, используемый для физически хранить файловые объекты на рабочий стол (который не следует путать с самой папкой рабочего стола). Ля типичный путь C:\Documents и Settings\имя пользователя\рабочий стол.
Переменные окружения Windows – теоретические основы
Переменные среды – Это по своей природе простые текстовые строки, которые позволяют хранить системную или пользовательскую информацию. Оны нужны, что бы быстро получить доступ к нужному ресурсу в операционной системе windows или системному значению. Все среды разделяют на два типа:
- Системные – Данный тип создается автоматически операционной системой, они доступны для всех пользователей. Информация хранится в реестре, в большинстве случаев, что бы изменения вступили в силу, нужно произвести перезапуск операционной системы.
- Пользовательские – Данный тип создается конкретным пользователей, поэтому информация доступна в большинстве случаев только для того пользователя, которые ее записал. В отличии от системных сред, пользовательские переменные окружения ОС Windows вступают сразу в силу, однако, нужно перезапустить те приложения, которые будут их использовать.
Доступ к средам в Windows XP осуществляется через значок "мой компьютер": нажимаем правой кнопкой мыши по значку и из контекстного меню выбираем пункт "Свойства", далее переходим на вкладку "Дополнительно" и там нажимаем на кнопку "переменные_среды". Частично, работу с переменными окружения Windows я рассмотрел в статье "Урок 4 по CMD - переменные окружения".
Set Environment Variables
After having read the chapter on reading environment variables, setting them is only a small step.
We will use the WSH Shell's Environment method again:
The output should look like this:
WSH Shell Object
List Environment Variables
To list all variables in the user environment:
The result will look like this:
If you read the previous chapters you will know how to list the variables from the other environments too.
Set Environment Variables
To set a variable, specify new values for its Name , UserName and/or VariableValue properties.
The following code, from the book Windows Server Cookbook by Robbie Allen, creates a new system environment variable called FOOBAR:
And the following code removes the environment variable again by giving it an empty value:
Replace the dot in the GetObject commands by a remote computer name to manage environment variables on that remote computer.
WMI's Win32_Environment Class
Besides being able to access environment variables on remote computers, WMI's Win32_Environment class also allows us to access (read and set) environment variables for other users!
See MSDN for detailed information on this class' properties.
Read Environment Variables
Reading an environment variable is simple:
The output will look like this:
The ExpandEnvironmentStrings method can expand environment variables embedded in a string too:
The output will look like this (but probably longer):
This behaviour is exactly like that of a batch file: the environment variable is replaced by its value when the string is processed.
Some environment variables are actually the result of two variables being merged. The environment variable PATH , for example, is defined in the system environment as well as in the user environment, as can be seen in this screenshot of the "System" Control Panel applet.
In this case, if we query the PATH environment variable like we did just before, the result will look like this:
As we can see, the PATH value from the user environment was appended to the value from the system environment.
Other user variables, like TEMP , overwrite their system counterpart:
The output will look like this:
Note: | In fact, it gets even more complicated: if you look in the "System" Control Panel applet, you'll notice that the TEMP value in the user environment displays the long path name, not the short 8.3 notation. |
Only the system environment values will be available to other users logging on to the same computer, the user environment values are part of the (roaming) profile and hence will be different or even absent for other users.
As you may already have guessed, this technique is not suited for setting environment variables.
To set an environment variable, we first need to find a way to specify in which environment we would like to set that variable.
That is where we use the WSH Shell's Environment method:
Valid parameters for Environment are PROCESS , SYSTEM , USER and VOLATILE .
The resulting output will look like this:
Had we used the PROCESS parameter, the output would have looked like this:
This is the value the WSH Shell's ExpandEnvironmentStrings method would return; ExpandEnvironmentStrings can only read the process environment.
OK, time for a demonstration:
This is what the resulting output will look like:
Experiment, play with the code.
So far all we did is read environment variables, which is absolutely harmless.
Переменные среды Windows – практическая часть
Хорошо, теперь давайте перейдем непосредственно к основной части статьи. Мы рассмотрим объект WScript.Shell, его свойство Environment позволяет работать с переменными окружения Windows:
Environment ([strType]) – По умолчанию, данное свойство предоставляет доступ ко всем переменным окружения Windows типа System, но можно задать и другой тип, их всего четыре:
И так, переменная среда Windows, это переменная, которая хранится в самой системе, она может быть временной, системной или, может быть создана пользователем. Так, благодаря переменным окружения Windows мы можем через меню Пуск/Выполнить запускать командную строку или калькулятор (все то, что лежит в системных каталогах) не вводя полного пути. Также, Windows переменные окружения хранят информацию о процессоре, профиле пользователя и многое другое.
Давайте напишем простой сценарий на языке vbscript для лучшего понимания ситуации:
'********************************************* ' wscript_shell_environment ' Переменные среды Windows ' environment.vbs '********************************************** Option Explicit dim WshShell, index dim WshEnvirSys, WshEnvirUsr, WshEnvirVol, WshEnvirProc dim s, u, v, p s = "" v = "" u = "" p = "" ' формируем ссылку на объект set WshShell = WScript.CreateObject("WScript.Shell") ' тип SYSTEM set WshEnvirSys = WshShell.Environment ' тип USER set WshEnvirUsr = WshShell.Environment("USER") ' тип VOLATILE set WshEnvirVol = WshShell.Environment("VOLATILE") ' тип PROCESS set WshEnvirProc = WshShell.Environment("PROCESS") For Each index In WshEnvirSys s = s & index & vbCrLf Next For Each index In WshEnvirUsr u = u & index & vbCrLf Next For Each index In WshEnvirVol v = v & index & vbCrLf Next For Each index In WshEnvirProc p = p & index & vbCrLf Next MsgBox "Системные:" & vbCrLf & vbCrLf& s MsgBox "Пользовательские:" & vbCrLf & vbCrLf & u MsgBox "Временные:" & vbCrLf & vbCrLf & v MsgBox "Текущий процесс:" & vbCrLf & vbCrLf & p
Видим, что WshShell хранит ссылку на объект WScript.Shell, WshEnvirSys хранит ссылку на коллекцию переменных окружения Windows типа SYSTEM , WshEnvirUsr – USER , WshEnvirVol – VOLATILE и WshEnvirProc – PROCESS . Видим, что при создании ссылки на объект или коллекцию в языке vbscript используется ключевое слово set. Далее мы используем цикл For Each для перебора элементов коллекции и формирования списка. Списки выводятся в конце сценария с помощью функции MsgBox.
А вот аналогичный пример, но уже на языке jscript:
//********************************************* // wscript_shell_environment // Переменные среды Windows // environment.js //********************************************** var WshShell2; var WshEnvirSys, WshEnvirUsr1, WshEnvirVol, WshEnvirProc; var s="", u="", v="", p=""; // формируем ссылку на объект WshShell2 = WScript.CreateObject("WScript.Shell") // тип SYSTEM WshEnvirSys = new Enumerator(WshShell2.Environment("SYSTEM")); // тип USER WshEnvirUsr1 = new Enumerator(WshShell2.Environment("USER")); // тип VOLATILE WshEnvirVol = new Enumerator(WshShell2.Environment("VOLATILE")); // тип PROCESS WshEnvirProc = new Enumerator(WshShell2.Environment("PROCESS")); for (; !WshEnvirSys.atEnd(); WshEnvirSys.moveNext()) s+=WshEnvirSys.item()+"\n"; for (; !WshEnvirUsr1.atEnd(); WshEnvirUsr1.moveNext()) u+=WshEnvirUsr1.item()+"\n"; for (; !WshEnvirVol.atEnd(); WshEnvirVol.moveNext()) v+=WshEnvirVol.item()+"\n"; for (; !WshEnvirProc.atEnd(); WshEnvirProc.moveNext()) p+=WshEnvirProc.item()+"\n"; WScript.Echo ( "Системные:\n\n" + s); WScript.Echo ( "Пользовательские:\n\n" + u); WScript.Echo ( "Временные:\n\n" + v); WScript.Echo ( "Текущий процесс:\n\n" + p);
Хорошо, у коллекции wscript shell environment есть свойство length , которое хранит в себе число всех элементов, метод Remove (strName) позволяет удалить переменную окружения ОС Windows, которая задана строковым параметром strName.
Хорошо, давайте рассмотрим следующий пример на языке vbscript:
'********************************************* ' wscript_shell_environment ' Переменные окружения ОС Windows ' environment_1.vbs '********************************************** Option Explicit dim WshShell1, index, u dim WshEnvirUsr, WshEnvirProc ' формируем ссылку на объект set WshShell1 = WScript.CreateObject("WScript.Shell") set WshEnvirUsr = WshShell1.Environment("USER") u = "Количество: " & vbTab & WshEnvirUsr.Length & vbCrLf & vbCrLf For Each index In WshEnvirUsr u = u & index & vbCrLf Next MsgBox u '************************************************************************ ' Создаем переменную_окружения с именем my_usr_var ' и значением "простой текст" '************************************************************************ WshEnvirUsr("my_usr_var") = "простой текст" u = "Количество: " & vbTab & WshEnvirUsr.Length & vbCrLf & vbCrLf For Each index In WshEnvirUsr u = u & index & vbCrLf Next MsgBox u '*********************************** ' Удаляем my_usr_var '*********************************** WshEnvirUsr.Remove("my_usr_var") u = "Количество: " & vbTab & WshEnvirUsr.Length & vbCrLf & vbCrLf For Each index In WshEnvirUsr u = u & index & vbCrLf Next MsgBox u
В этом примере по wscript shell environment свойству мы создали собственную переменную среду my_usr_var, записав в нее текстовую строку. Перед этим, мы вывели общее количество всех сред.
А вот аналогичный пример на языке jscript:
//********************************************* // wscript_shell_environment // Переменные окружения ОС Windows // environment_1.js //********************************************** var WshShell1, u var WshEnvirUsr2, WshEnvirProc // формируем ссылку на объект WshShell1 = WScript.CreateObject("WScript.Shell"); WshEnvirUsr2 = WshShell1.Environment("USER"); WshEnum = new Enumerator (WshEnvirUsr2); u = "Количество:\t" + WshEnvirUsr2.Length + "\n\n"; for (; !WshEnum.atEnd(); WshEnum.moveNext()) u+=WshEnum.item()+"\n"; WScript.Echo (u); //************************************************************************ // Создаем переменную_окружения с именем my_usr_var // и значением "простой текст" //************************************************************************ WshEnvirUsr2("my_usr_var_1") = "простой текст"; WshEnum = new Enumerator (WshEnvirUsr2); u = "Количество:\t" + WshEnvirUsr2.Length + "\n\n"; for (; !WshEnum.atEnd(); WshEnum.moveNext()) u+=WshEnum.item()+"\n"; WScript.Echo (u); //*********************************** // Удаляем my_usr_var //*********************************** WshEnvirUsr2.Remove("my_usr_var_1"); WshEnum = new Enumerator (WshEnvirUsr2); u = "Количество:\t" + WshEnvirUsr2.Length + "\n\n"; for (; !WshEnum.atEnd(); WshEnum.moveNext()) u+=WshEnum.item()+"\n"; WScript.Echo (u);
И так, в этой статье мы рассмотрели работу со свойством Environment класса WScript.Shell. Подписывайтесь на обновление блога, что бы быть в курсе новых материалов.
Спасибо за внимание. Автор блога Владимир Баталий
Давайте для начала рассмотрим теоретические основы, а уже потом займемся программированием. Как мы помним из прошлых уроков, прежде всего нам нужно создать ссылку на класс WScript_Shell:
Язык VBScript:
Set WshShel1 = WScript.CreateObject("WScript.Shell")
Язык JScript:
В данном случае, для создания ссылки на объект мы используем функцию CreateObject, видим, что для языка VBScript нужно дополнительно прописывать ключевое слово set.
ExpandEnvironmentStrings (strString) – Данные метод ExpandEnvironmentStrings позволяет работать с переменными средами Windows. Метод содержит только один строковой параметр, в котором указывается имя переменной Windows среды (переменные_среды могут создаваться как пользователем, так и системой). Тут strString является названием переменной среды Windows, которое должно заключаться в символ процента (%). При обзоре метода Environment я уже рассматривал работу с переменными_окружения.
Имена некоторых переменных сред Windows полезно знать:
- WINDIR – путь к папке Windows.
- PATH – путь для поиска исполняемых файлов.
CurrentDirectory – Данное свойство хранит полный путь к текущему сценарию. Стоит учитывать один момент, что, если путь содержит пробелы, то при попытке использовать данное свойство для запуска текущего сценария возникнет ошибка. В таких случаях путь должен быть с обеих сторон заключен в двойные кавычки, но есть одна проблема, язык vbscript не позволяет экранировать двойную кавычку, в отличии от JScript. Поэтому, тут нужно применить функцию Chr с кодом 34 (Урок 12 по VBScript: Строковые функции vbs).
Хорошо, с теорией разобрались, теперь давайте приступим к программированию. Для начала напишем программный код на языке VBScript:
'************************************************************************* ' Метод ExpandEnvironmentStrings и свойство CurrentDirectory ' Windows переменные среды и текущий каталог ' expandenvironmentstrings.vbs '************************************************************************** Option Explicit dim WshShell1, list, cur_dir, res ' формируем ссылку на объект set WshShell1 = WScript.CreateObject("WScript.Shell") With WshShell1 ' текущий каталог cur_dir = .CurrentDirectory ' папка Windows и исполняемые файлы list = .ExpandEnvironmentStrings("%WinDir%") & vbCrLf & .ExpandEnvironmentStrings("%Path%") & vbCrLf ' расширения и текущий каталог list = list & .ExpandEnvironmentStrings("%PathExt%") & vbCrLf & cur_dir End With 'Список заданных Windows переменных сред MsgBox list ' Запрашиваем у пользователя разрешение на запуск текущей копии сценария res = MsgBox("Запустить еще раз сценарий ?", vbYesNo + vbQuestion + vbDefaultButton2, "Запуск сценария") If res = vbYes Then WshShell1.Run(chr(34) & cur_dir & "\" & WScript.ScriptName & chr(34)) End If
В этом примере мы сначала создаём ссылку на нужный класс, которая будет храниться в WshShell1. Далее в cur_dir сохраняем путь к текущему сценарию. В блоке with мы записываем данные в list, которая хранит информацию о трех Windows переменных средах и путь к текущему сценарию. Далее, с помощью метода MsgBox мы выводим диалоговое окно – если пользователь нажмет ОК, то произойдёт повторный запуск текущего скрипта с помощью функции Run, в противном случае, работа скрипта завершиться. Видим, что для вставки кавычек мы использовали chr(34), тут 34 – код двойных кавычек.
А вот аналогичный пример, но уже на языке jscript:
//************************************************************************* // Метод ExpandEnvironmentStrings и свойство CurrentDirectory // Windows переменные среды и текущий каталог // expandenvironmentstrings.js //************************************************************************* var WshShell, list1="", cur_dir1, res; var vbOKCancel = 1, vbInformation = 64; // формируем ссылку на объект WshShell = WScript.CreateObject("WScript.Shell"); with(WshShell) < // текущий каталог cur_dir1 = CurrentDirectory; // папка Windows и исполняемые файлы list1+= ExpandEnvironmentStrings("%WinDir%") + "\n" + ExpandEnvironmentStrings("%Path%") + "\n"; // расширения и текущий каталог list1+= ExpandEnvironmentStrings("%PathExt%") + "\n" + cur_dir1; >//Список заданных переменных окружения WScript.Echo(list1); // Запрашиваем у пользователя разрешение на запуск текущей копии сценария res = WshShell.Popup("Запустить еще раз сценарий ?", 5, "Запуск сценария", vbOKCancel + vbInformation); if (res ==1)
Тут вместо функции MsgBox мы использовали функцию Popup объекта Wscript_Shell, а для экранирования кавычек применили ESC-последовательность. В остальном, особых изменений нет, разве что… нам пришлось объявить дополнительные константы vbOKCancel и vbInformation, так как они определены по умолчанию только для языка VBScript.
Спасибо за внимание. Автор блога Владимир Баталий
Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.
Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:
set Var1=D:\Work set Var2=100 set Var3="Привет Мир. "
В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу "Привет Мир. "
set Var3 set VAR3 set vAr3
echo %Var3% echo %VAR3% echo %vAr3%
Стоит учитывать один момент, запись
это не одно и тоже, то есть, в первом случае мы создаем cmd переменную "var1", а во втором – "var1 ". С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел.
Видим, что бы вывести значение переменной с помощью функции Echo, мы заключаем ее в символ "%", для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.
Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. Мы сможем обращаться к ним на протяжение всего сеанса работы.
Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:
Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:
просто выведет строчку %Var3%, а команда
Стоит учитывать тот момент, что если мы хотим, что бы переменная командной строки Windows содержала специальные символы (например, @ < >& | ^ ), то их нужно экранировать. В языке jscript для вывода специальных символов используются esc-последовательности, в командной строке специальный символ экранируется с помощью "^":
set Var4=100 ^& 3 = 5 set Var5=100 ^^3
В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:
"100 & 3 = 5"
"100 ^3"
Стоит обратить внимание, что если мы попытаемся вывести значения данных переменных с помощью функции cmd set, то проблем не возникнет, но если будет использовать функцию echo, то получим совсем не тот результат, что ожидали. Так, при попытке выполнить следующую команду:
100
"3" не является внутренней или внешней командой, исполняемой программой или командным файлом.
Это происходит из-за повторного анализа спец-символов при использовании функции echo. Надо просто прописать символ "^" экранирования не один раз, а трижды:
set Var4=100 ^^^& 3 = 5 set Var5=100 ^^^^3
Теперь при выполнении кода:
echo %var4% echo %var5%
все пройдет успешно.
Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.
Область видимости – блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью "Урок 3 по JScript: Объявление пользовательских функций".
Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.
Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL . Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++, так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:
@echo off set var1=0 rem Начало локализации setlocal set var1=5 echo Lokalnaya: var1= %var1% endlocal echo Globalnaya: var1= %var1%
Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL . В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.
Спасибо за внимание. Автор блога Владимир Баталий
There are several ways to read or write environment variables:
- Use the WSH Shell object
- Use WMI's Win32_Environment class
- Read/write the variables directly from/to the registry
As directly accessing the registry is both risky and usually requires a reboot for the changes to take effect, I would not recommend using it, unless all other methods fail.
Read or List Environment Variables
The following code, created with the help of Scriptomatic, lists all TEMP variables on the local computer:
Читайте также: