2013-10-08 3 views
-1

У меня есть пакетный скрипт, который в основном выполняет некоторую замену строк на основе конфигураций на этапе предварительной сборки для визуальной студии. Пакетный сценарий отлично работает, когда я запускаю его из cmd. Но если я запустил его из предварительной сборки VS, следующая строка не будет оценивать% replaceStr% и% version% как значения переменных. Я даже пробовал эхо-повторять эти 2, и они не оцениваются как переменные.пакетный скрипт и предварительная подготовка visual studio

if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!" 

! ReplaceStr! и! версия! (через эхо, я не думаю, что могу использовать! внутри! для замены строки.

Что может быть причиной отказа при запуске из команд предварительной сборки VS, но отлично работает, когда я запускаю из cmd. добавлено C: \ WINDOWS \ system32 \ CMD/с в prebuild и до сих пор не работает Любые мысли

Благодаря

+0

Немного больше вашего кода может показать причину, это строка, которую вы указали внутри командного блока? – jeb

ответ

0

Где вы установки переменных Каждый процесс получает копию из его окружения родителей.?!. Но вы не можете повлиять на процессы дочерних процессов родительского процесса только в момент их запуска и свои собственные.

Пакетный файл s используйте cmd.exe, они работают в среде. Это единственный случай, когда программа влияет на родительскую среду.

Окружающая среда одного cmd является отдельной для чужих.

И из комплекта разработки программного обеспечения для Windows Vista,

Переменные окружения Каждый процесс имеет блок окружения, содержащий набор переменных среды и их значений. Командный процессор предоставляет команду set для отображения своего блока среды или для создания новых переменных среды. Программы, запущенные командным процессором, наследуют переменные среды командного процессора.

По умолчанию дочерний процесс наследует переменные среды своего родительского процесса. Тем не менее, вы можете указать другую среду для дочернего процесса, создав новый блок среды и передав ему указатель в качестве параметра функции CreateProcess.

Каждый блок среда содержит переменные среды в следующем формате:

Var1=Value1\0 
Var2=Value2\0 
Var3=Value3\0 
... 
VarN=ValueN\0\0 

Имя переменной среды не может включать в себя знак равенства (=). Общий размер блока среды для процесса не может превышать 32 767 символов.

Функция GetEnvironmentStrings возвращает указатель на блок среды вызывающего процесса. Это следует рассматривать как блок только для чтения; не изменяйте его напрямую. Вместо этого используйте функцию SetEnvironmentVariable для изменения переменной среды. Когда вы закончите с блоком среды, полученным из GetEnvironmentStrings, вызовите функцию FreeEnvironmentStrings, чтобы освободить блок.

Вызов SetEnvironmentVariable не влияет на переменные системной среды. Пользователь может добавлять или изменять переменные системной среды с помощью панели управления. Чтобы программно добавить или изменить переменные системной среды, добавьте их в раздел реестра HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment, затем передайте сообщение WM_SETTINGCHANGE с lParam, настроенным на строку «Среда». Это позволяет приложениям, таким как оболочка, получать обновления. Обратите внимание, что значения переменных среды, перечисленных в этом ключе, ограничены 1024 символами.

Функция GetEnvironmentVariable определяет, определена ли указанная переменная в среде вызывающего процесса, и если да, то каково ее значение.

0

Я думаю:

Даже из командной строки ваш пакетный файл не работает.
Я предполагаю, что в первый раз, когда он терпит неудачу, но потом он работает.

Если это так, то ваш код находится внутри блока скобок.

Возможно, ваш код выглядит следующим образом

if %a%==%b% (
    set version=%a% 
    if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!" 
) 

То есть эффект от времени расширения процента переменных, они расширяются, когда весь блок разбираются, но ни одна из линий не выполняются в данный момент.
Таким образом, %version% не раскрывается ни к чему (для первого запуска), но следующий прогон будет правильно .

Чтобы избежать этого, вы можете использовать различную технику, в зависимости от того, насколько проблематично ваше содержание.

call set "line=%%line:!replaceStr!=!version!%%" 

Анализатор расширяет эту линию в два раза, в первый восклицательные знаки расширяются, а затем вызов будет расширять %line:rep=ver%.

Это работает, если ваша строка не содержит критических специальных символов, таких как кареты ^, проценты или кавычки.

Смежные вопросы