2016-02-22 2 views
2

Я создаю командный файл для запуска команды. Я устанавливаю команду следующим образом.Переполнение пакетного файла

set my_command=some_command %out_file% 

тогда я бегу (или намеревался) команда с различными out_file переменной

set out_file=[some_dir_1] 
%my_command% 

set out_file=[some_dir_2] 
%my_command% 

Когда я запустить пакетный файл, он работает my_command с out_file = [some_dir_2] дважды, вместо запуска первый раз с out_file = [some_dir_1]

Есть ли способ, которым я могу запускать одну и ту же команду с каждым изменением var каждый раз?

Спасибо.

ответ

3

Это похоже на работу:

@echo off 
setlocal EnableDelayedExpansion 
set my_command=some_command ^^!out_file^^! 
set out_file=[some_dir_1] 
echo %my_command% 

set out_file=[some_dir_2] 
echo %my_command% 
pause 

Это работает, устанавливая значение my_command в some_command !out_file!, так и с сбежавших восклицательными знаками. Когда вы используете echo !my_command!, вы увидите, что в нем есть восклицательные знаки. Однако, когда вы используете %my_command%, восклицательные знаки считываются после знаков%, поэтому он видит другую переменную для расширения.

Вы можете себе представить, пакетный порядок синтаксического анализа, как это:

  1. расширить такие переменные, как %var% их значение
  2. расширить такие переменные, как !var! их значение

Так первый, анализатор видит

% my_command%

, которые заводятся в

some_command! Out_file!

Однако тогда (это называется задержкой расширение по причине,) начинает проверку на восклицательные знаки и изменения, которые в

some_command [some_dir_2]

EDIT

Просто заметил, что это также работает:

@echo off 
setlocal EnableDelayedExpansion 
set "my_command=some_command ^!out_file^!" 
set "out_file=[some_dir_1]" 
echo %my_command% 

set "out_file=[some_dir_2]" 
echo %my_command% 
pause 
+0

Это сработало, но просто любопытно .... что делать ^^! делать иначе, чем%? – ScottF

+0

@ScottF добавлен более подробное объяснение. –

+0

@ScottF немного улучшил его. –

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