2017-07-13 19 views
4

のために使用して変数内のコマンドを実行しているので、私は、バッチファイル内のテキストファイルバッチ;

(
set /p var1= 
set /p var2= 
set /p var3= 
)<oi.txt 

から保存されたいくつかのVARSを持っているし、if文、彼らは表しています。私が実行した場合

% VAR1%それは、しかし、それは

`if` is not recognized as an internal or external command 
`if` is not recognized as an internal or external command 
`if` is not recognized as an internal or external command 

を返し、それがあれば動作します私は(SETLOCAL enabledelayedexpansionに)

for /l %%i in (1,1,3) do !var%%i! 

実行しかしとき、if文を実行しますそれはマイクロソフトの監視ですか?このオプションを持たないという代償で別のバグを修正するものでしょうか?

*これはforコマンドとは関係ありません。!var%number%! if文を内部に持つvar1で、同じ問題が返されます。 (また、var内のif文が正しいことを100%確信していますが、それが間違っていてもなぜ認識されないのですか)

+2

ので、あなたがoi.txt' 'でいくつかのコマンドがありますか?彼らは何ですか? – npocmaka

+1

@npocmaka問題は、 'set" var = echo hi "'に続いて '!var!'が動作するが 'set" var = if 1 equ 1 echo true "'に続いて '!var!'代わりに ''が '...と認識されない場合は ''エラーメッセージを生成します。 – treintje

+2

'oi.txt'の内容を投稿してください!とにかく、 'if'と' for'(と 'rem')のコマンドはコマンドインタープリタによって特別に扱われますが、遅延拡張が処理される前に認識されています。このスレッドを参考にしてください:[Windows Command Interpreter(CMD.EXE)はどのようにスクリプトを解析しますか?](https://stackoverflow.com/q/4094699) – aschipfl

答えて

2

環境変数に格納されているコマンドマクロ。 Very complicated macrosは、%macro%を使用して作成して実行することができます。しかし、遅延拡張による!macro!の実行はひどく不自由です。多くの制限があります。

cmd.exeコマンド(およびバッチ)パーサーは複雑な獣です。私はその行動を説明する公式の文書を知らない。

しかし、遅延拡張マクロの実行がIFまたはFOR文で機能しない理由を説明するのに役立つset of parsing phase rules developed by jebがあります。

IFとFORの両方にフェーズ2で発生する特殊な解析が必要ですが、フェーズ5までは遅延拡張が行われません。したがって、遅延拡張でコマンドを実行しようとすると、必要なIF解析とFOR解析が行われません。

回避策はありません。環境変数 "macro"にFORまたはIFを含める場合は、マクロを通常の%macro%拡張で実行する必要があります。

説明は基本的に、FORオプションまたはIFオプションまたは遅延フラグを遅延拡張で使用できない理由と同じです。ここで

はIFの例である:

@echo off 
setlocal enableDelayedExpansion 
set "ifFlag=/I" 

:: This works 
if %ifFlag% a==A echo match 

:: This does not work 
if !ifFlag! a==A echo match 

そしてここでは、例えば次のとおりです。

@echo off 
setlocal enableDelayedExpansion 
set "forOptions=delims=: tokens=1,2" 

:: This works 
for /f "%forOptions%" %%A in ("1:2") do echo A=%%A B=%%B 

:: This does NOT works 
for /f "!forOptions!" %%A in ("1:2") do echo A=%%A B=%%B 
+0

パーサーには非常に素晴らしい情報があります。 %%var2%....手作業で、あるいは全てをテキストファイルに入れてください。 – Jonhyfun

+1

フェーズルールは、forループの変数展開で 'rem'、' if'、 'for'コマンドを実行できない理由を説明しています。これらのコマンドのいずれかに 'var# 'が展開されると、次のいずれかが動作しなくなります:for/f" tokens = 1、* delims == "%% i in(' set var ')do %% j'時間'%% j'がフェーズ4で展開され、フェーズ2が既に終了しており、パーサーは' rem'、 'if'、' for'コマンドをスキャンしなくなりました。 – treintje

+0

@treintje - 私は水を泥水にしたくなかったが、あなたは絶対に正しい。 – dbenham