Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Не устанавливаются переменные в Win7 (http://forum.oszone.net/showthread.php?t=289883)

DeepWaters 24-10-2014 10:50 2419721

Не устанавливаются переменные в Win7
 
Здравствуйте!
Возникла неожиданная проблема в Windows 7, нужно создать а потом запустить пару BATничков, в одном устанавливаются пути командой SET а в другом они используются, обнаружил вдруг что команда SET невыполняется и никаких переменных не создает, поэтому второй батник неработает без этих переменных, пути указывал правильно, от имени администратора запускал, странно, выглядит первый батник примерно так:

set HOME=C:\sdfsdg
set KEY_DIR=C:\sdfsdg\sdfs
set KEY_EMAIL=ivan@localhost

Iska 24-10-2014 11:01 2419724

Цитата:

Цитата DeepWaters
примерно так: »

Приведите полный код первого и второго пакетных файлов. Укажите, каким образом вызываются на исполнение оба пакетных файла.

DeepWaters 24-10-2014 11:10 2419731

Не суть важно но если настаиваете

Первый
set HOME=C:\OpenVPN\easy-rsa
set KEY_CONFIG=openssl-1.0.0.cnf
set KEY_DIR="C:\OpenVPN\ssl"
set KEY_SIZE=1024
set KEY_COUNTRY=RU
set KEY_PROVINCE=Moscow
set KEY_CITY=Moscow
set KEY_ORG=test_org
set KEY_EMAIL=root@localhost
set KEY_CN=test
set KEY_NAME=test
set KEY_OU=test
set PKCS11_MODULE_PATH=test
set PKCS11_PIN=1234

второй

@echo on
rem move to the HOME directory specified in VARS script
cd\
cd %HOME%
rem set a temporary KEY_DIR variable
set d=%KEY_DIR%
rem delete the KEY_DIR and any subdirs quietly
rmdir /s /q %d%
rem make a new KEY_DIR
mkdir %d%
rem copy in a fesh index file so we begin with an empty database
copy index.txt.start %d%\index.txt
rem copy in a fresh serial file so we begin generating keys at index 01
copy serial.start %d%\serial.
pause

Второй файл не видит никаких тех путей установленных командой SET в первом батнике, открывал сеанс DOS вводил SET, и действительно эти переменные пусты

Iska 24-10-2014 11:15 2419733

DeepWaters, это не всё.
Цитата:

Цитата Iska
Укажите, каким образом вызываются на исполнение оба пакетных файла. »


DeepWaters 24-10-2014 11:20 2419735

Из Total commander XP, Enter-ом

Iska 24-10-2014 11:34 2419744

DeepWaters, по очереди, сначала один, затем другой — так я понимаю? Если так, то в этом и состоит ошибка: для исполнения пакетных файлов задействуются два дочерних экземпляра командного процессора «cmd.exe». И второй экземпляр командного процессора, в котором исполняется второй пакетный файл, знать ничего не знает о произведённых изменениях в переменных окружения первым пакетным файлом в первом экземпляре командного процессора.

Создайте ещё один пакетный файл, в котором будут последовательно вызываться на исполнение оба Ваших пакетных файла:
Код:

@echo off

call MyBatch01.cmd
call MyBatch02.cmd

exit /b 0

и запускайте его. Либо вставьте вызов второго пакетного файла в конец первого пакетного файла.

mwz 24-10-2014 12:15 2419769

DeepWaters, переменные, созданные в сеансе CMD, являются локальными для этого сеанса и не имеют никакого отношения к другому сеансу CMD. Вот если бы вы вызывали второй батник из первого – тогда бы они наследовались.

DeepWaters 24-10-2014 12:53 2419792

Еще подскажите пожалуйста как правильно в батниках иметь дело с длинными именами каталогов содержащих пробелы, например c:\program files (понадобилось переделать вышеуказанные батники под каталог program files)

указываю
set KEY_DIR=%ProgramFiles%\OpenVPN\ssl

по команде SET выходит что все правильно -
KEY_DIR=C:\Program Files\OpenVPN\ssl
но потом при обращении к этой переменной команда обращается к пути Files\OpenVPN\ssl\

Iska 24-10-2014 13:16 2419804

Цитата:

Цитата DeepWaters
как правильно в батниках иметь дело с длинными именами каталогов содержащих пробелы, например c:\program files »

Как правило — так:
Код:

set KEY_DIR=%ProgramFiles%\OpenVPN\ssl

dir "%KEY_DIR%"


Цитата:

Цитата DeepWaters
но потом при обращении к этой переменной команда обращается к пути Files\OpenVPN\ssl\ »

Код:

rmdir /s /q "%d%"
rem make a new KEY_DIR
mkdir "%d%"

P.S. Я бы заменил пару rd/md на такое:
Код:

pushd "%d%" && (rmdir /s /q "%d%" & popd) 2>nul

Georgio 24-10-2014 13:42 2419816

Цитата:

Цитата Iska
Как правило — так:
Код:

set KEY_DIR=%ProgramFiles%\OpenVPN\ssl
dir "%KEY_DIR%"

»


Даже лучше так:

Код:

set "KEY_DIR=%ProgramFiles%\OpenVPN\ssl"
dir "%KEY_DIR%"

.



Цитата:

Цитата Iska
P.S. Я бы заменил пару rd/md на такое:
Код:

pushd "%d%" && (rmdir /s /q "%d%" & popd) 2>nul
»


"+1".

Iska 24-10-2014 13:45 2419821

Цитата:

Цитата Georgio
Даже лучше так: »

Я не исследовал вопрос — сохраняется ли нормальное поведение «set» в случае наличия внутренних кавычек (одинарной кавычки, двойной, тройной…) внутри присваиваемой строки?

Georgio 24-10-2014 15:10 2419863

Iska, на собственном опыте знаю, что в отличие от других конструкций с кавычками, например:
Код:

cmd /c "..."
,
Код:

mshta "..."
,
Код:

for /f %%i in ("...") do ...
,
Код:

for /f %%i in ('"..."') do ...
и т. п., команда "SET" воспринимает пюбое (как чётное, так и нечётное) количество кавычек, и это не зависит от выбора конструкции:
Код:

set A=B
в "простом" случае или
Код:

set "A=B"
в случае присутствия "poison characters". Исключением является тот случай, когда кавычка (кавычки) являются именем переменной или являются частью имени переменной, но это-- тема для отдельного исследования, и, по-моему, эта проблема разрешаеся как раз с помощью консрукции
Код:

set "A=B"
.

Iska 24-10-2014 16:12 2419890

Georgio, спасибо, ясно.


Время: 21:01.

Время: 21:01.
© OSzone.net 2001-