2013-12-03 3 views
0

У меня есть простой ini-файл ... действительно просто файл key = value, который я хочу использовать для установки в качестве переменных для моего скрипта.Пакетный файл для циклических динамических переменных из файла без setlocal?

Мой ини файл:

DATABASE=snoopy 

Мой код Пакетный файл

@echo off 
SET DATABASE=woodstock 

FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
    echo a=%%a 
    echo b=%%b 
    pause 
    SET %%a=%%b 
    ECHO DATABASE=%DATABASE% 
) 

эхо-а и Ь правильно, он показывает

a=DATABASE 
b=snoopy 

Но в конце, когда я эхо % DATABASE% после вызова SET %% a = %% b Он по-прежнему показывает

DATABASE=woodstock 

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

+0

Не могли бы вы объяснить, что вы подразумеваете под «local» или «global»? Является ли «local» текущим CMD-окном и «глобальным» набором переменных среды, которые устанавливаются при открытии нового окна CMD из * меню «Пуск» * (например, все будущие окна CMD)? BTW. Вы не сможете изменять другие открытые CMD-окна. –

+0

Я имею в виду использование SetLocal/EndLocal .. На самом деле, думая об этом, я использую SetLocal перед циклом for. Возможно, я должен использовать его в верхней части файла. Я попробую это – Dss

+0

Когда вы включили задержку расширения, вы изменили свое эхо, чтобы использовать оператор замедленного расширения? 'ECHO DATABASE =! DATABASE!' – indiv

ответ

0

Ну, не нужно ничего делать, чтобы заставить его работать.

Это работает.

Ваша проблема заключается в том, что, когда считываются блок for (все строки в скобках в коде), переменные заменяются их значениями, поэтому строка echo %DATABASE% преобразуется в echo woodstock. НО переменная удерживает правильное значение, измененное внутри цикла for. Попытайтесь разместить эхо вне поля и посмотреть, что это за значение.

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

+0

Да, теперь я вижу. Я переместил setlocal enabledelayedexpansion в начало моего файла и обработал его. Благодаря! – Dss

0

Хорошо, я получил его сейчас. Пришлось включить замедленное расширение в верхней части файла, а не только на вызов подпрограммы. Затем установите %% a и %% b в замедленные переменные и установите их равными eachother и которые сработали. Окончательный код:

@echo off 
SetLocal EnableDelayedExpansion 

SET DATABASE=woodstock 

FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
    set tmpA=%%a 
    set tmpB=%%b 
    SET !tmpA!=!tmpB! 
) 
ECHO DATABASE=%DATABASE% 

И это меняет его на "Снупи"

Спасибо всем!

+0

Слишком много осложнений. 'for .... do (set" %% a = %% b ")' как исходный код, работает без проблем и без 'setlocal'. Как сказано, изменения видны вне цикла for. Отсроченное расширение необходимо только для просмотра изменений внутри одного и того же цикла, где переменная меняет свое значение. –

+1

... или еще проще: 'for/f 'delims =" %% a in (C: \ mycfg.ini) установить "%% a" ' – Aacini

+0

Aacini !! это оно! идеально. Не понял, что вы можете сделать «SET» VAR = VALUE » – Dss

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