Показать полную графическую версию : Не устанавливаются переменные в 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
примерно так: »
Приведите полный код первого и второго пакетных файлов. Укажите, каким образом вызываются на исполнение оба пакетных файла.
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, и действительно эти переменные пусты
DeepWaters, это не всё.
Укажите, каким образом вызываются на исполнение оба пакетных файла. »
DeepWaters
24-10-2014, 11:20
Из Total commander XP, Enter-ом
DeepWaters, по очереди, сначала один, затем другой — так я понимаю? Если так, то в этом и состоит ошибка: для исполнения пакетных файлов задействуются два дочерних экземпляра командного процессора «cmd.exe». И второй экземпляр командного процессора, в котором исполняется второй пакетный файл, знать ничего не знает о произведённых изменениях в переменных окружения первым пакетным файлом в первом экземпляре командного процессора.
Создайте ещё один пакетный файл, в котором будут последовательно вызываться на исполнение оба Ваших пакетных файла:
@echo off
call MyBatch01.cmd
call MyBatch02.cmd
exit /b 0
и запускайте его. Либо вставьте вызов второго пакетного файла в конец первого пакетного файла.
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\
как правильно в батниках иметь дело с длинными именами каталогов содержащих пробелы, например 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
Как правило — так:
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".
Даже лучше так: »
Я не исследовал вопрос — сохраняется ли нормальное поведение «set» в случае наличия внутренних кавычек (одинарной кавычки, двойной, тройной…) внутри присваиваемой строки?
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".
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC