PDA

Показать полную графическую версию : Не устанавливаются переменные в Win7


DeepWaters
24-10-2014, 10:50
Здравствуйте!
Возникла неожиданная проблема в 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
примерно так: »
Приведите полный код первого и второго пакетных файлов. Укажите, каким образом вызываются на исполнение оба пакетных файла.

DeepWaters
24-10-2014, 11:10
Не суть важно но если настаиваете

Первый
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
DeepWaters, это не всё.
Укажите, каким образом вызываются на исполнение оба пакетных файла. »

DeepWaters
24-10-2014, 11:20
Из Total commander XP, Enter-ом

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

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

call MyBatch01.cmd
call MyBatch02.cmd

exit /b 0

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

mwz
24-10-2014, 12:15
DeepWaters, переменные, созданные в сеансе CMD, являются локальными для этого сеанса и не имеют никакого отношения к другому сеансу CMD. Вот если бы вы вызывали второй батник из первого – тогда бы они наследовались.

DeepWaters
24-10-2014, 12:53
Еще подскажите пожалуйста как правильно в батниках иметь дело с длинными именами каталогов содержащих пробелы, например 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
как правильно в батниках иметь дело с длинными именами каталогов содержащих пробелы, например c:\program files »
Как правило — так:
set KEY_DIR=%ProgramFiles%\OpenVPN\ssl

dir "%KEY_DIR%"


но потом при обращении к этой переменной команда обращается к пути 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
Как правило — так:
set KEY_DIR=%ProgramFiles%\OpenVPN\ssl
dir "%KEY_DIR%" »


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

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

.



P.S. Я бы заменил пару rd/md на такое:
pushd "%d%" && (rmdir /s /q "%d%" & popd) 2>nul »


"+1".

Iska
24-10-2014, 13:45
Даже лучше так: »
Я не исследовал вопрос — сохраняется ли нормальное поведение «set» в случае наличия внутренних кавычек (одинарной кавычки, двойной, тройной…) внутри присваиваемой строки?

Georgio
24-10-2014, 15:10
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
Georgio, спасибо, ясно.




© OSzone.net 2001-2012