SET命令不会回显FOR / F循环参数值

时间:2019-07-12 15:52:52

标签: windows batch-file cmd

我在FOR / F循环中使用SET命令遇到一个问题,以回显循环参数的值(例如,%% g,%% h等)。我使用SET命令是因为我想查看在FOR / F循环迭代时为每个FOR / F循环参数分配了什么值。我特别希望查看CMD解析器剥离了多少插入符号转义字符(^),因为它处理的测试代码行是$code_test[00]数组记录中的最后一个元素:

@echo off

setlocal disabledelayedexpansion

set $code_test[00]=Record [00],2,green,blue,if not exist ^^!$m^^!^^!$n^^! (set /a $result+=3)

echo Value using ECHO command:
echo $code_test[00] = %$code_test[00]%
echo.

echo Value using SET command with Delayed Expansion DISABLED:
set $code_test[
echo.

setlocal enabledelayedexpansion

echo Value using SET command with Delayed Expansion ENABLED:
set $code_test[
echo.

for /f "tokens=1-10 delims=," %%g in ('set $code_test[') do (

    echo For /f loop values using ECHO command ...
    echo g = %%g
    echo h = %%h
    echo i = %%i
    echo j = %%j
    echo k = %%k
    echo.

    echo For /f loop values using SET command ...
    set %%g
    set %%h
    set %%i
    set %%j
    set %%k

)

该代码使用各种元素填充$code_test[xx]数组的一条记录,最后一条是Windows CMD测试代码语句。我想查看与该测试代码语句相对应的FOR / F循环参数的值,即%%k。因此,我同时使用了echoset命令来回显%%k的值,以查看%%k是否保留了插入符号(^)中出现的转义字符$code_test[00]的原始测试代码定义。 echo命令按预期工作,并从代码中删除了脱字符号(^)但是set命令完全失败。我已经阅读了有关CMD解释器如何解析代码here的帖子,但没有看到我的问题的答案。

我意识到处理FOR / F循环参数可能很棘手。我是否应该假设我不能直接处理FOR / F循环参数(例如set %%k),并将始终将FOR / F参数的值分配给环境变量作为一项策略,然后处理环境变量而不是FOR / F参数?

1 个答案:

答案 0 :(得分:0)

SET "blue62=108"
SET "%%%%k=hello"
ECHO after SET %%%%%%%% k errorlevel=!errorlevel!
set|FIND "k="

    echo For /f loop values using SET command ...
ECHO ++++++++++++++++!errorlevel!
    set %%g
    set %%h
    set %%i
    set %%j
ECHO :::::::::::::::::::::!errorlevel!
    SET if not exist !$m!!$n! (set /a $result+=3)
ECHO -----------!errorlevel!-------------------
ECHO :::::::::::::::::::::!errorlevel!
    SET "if not exist !$m!!$n! (set /a $result+=3)"
ECHO -----------!errorlevel!-------------------
    set %%k

)

我将您的报告扩展为包含以下结果的上述代码:

  

使用ECHO命令的/ f循环值...
  g = $ code_test [00] =记录[00]
  h = 2
  我=绿色
  j =蓝色
  k =如果不存在! (设置/ a $ result + = 3)
  
  SET %%%% k错误级别= 0后
  对于使用SET命令的/ f循环值...
  ++++++++++++++++++ 1
  未定义环境变量2
  未定义环境变量green
  blue62 = 108
  ::::::::::::::::::::: 1
  ----------- 1 -------------------
  ::::::::::::::::::::: 1
  ----------- 1 -------------------   未定义环境变量%k

我相信这表明set遇到的参数不是一个简单的缺少空格的字符串,并且带有可选的=进行赋值时,其行为很奇怪。

真正令人好奇的是Environment variable %k not defined没有与原始代码一起出现。

我相信您真的希望1970年的复古设计不仅防弹,而且在提供意外数据时也能始终如一地工作。像奶奶一样对待功能强大,但容易混淆。