Это похоже на работу:
@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%
, восклицательные знаки считываются после знаков%, поэтому он видит другую переменную для расширения.
Вы можете себе представить, пакетный порядок синтаксического анализа, как это:
- расширить такие переменные, как
%var%
их значение
- расширить такие переменные, как
!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
Это сработало, но просто любопытно .... что делать ^^! делать иначе, чем%? – ScottF
@ScottF добавлен более подробное объяснение. –
@ScottF немного улучшил его. –