我在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
。因此,我同时使用了echo
和set
命令来回显%%k
的值,以查看%%k
是否保留了插入符号(^)
中出现的转义字符$code_test[00]
的原始测试代码定义。 echo命令按预期工作,并从代码中删除了脱字符号(^)
。 但是set命令完全失败。我已经阅读了有关CMD解释器如何解析代码here的帖子,但没有看到我的问题的答案。
我意识到处理FOR / F循环参数可能很棘手。我是否应该假设我不能直接处理FOR / F循环参数(例如set %%k
),并将始终将FOR / F参数的值分配给环境变量作为一项策略,然后处理环境变量而不是FOR / F参数?
答案 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年的复古设计不仅防弹,而且在提供意外数据时也能始终如一地工作。像奶奶一样对待功能强大,但容易混淆。