我正在尝试读取文件名,并根据文件名设置Output
变量。
我已经尝试直接在findstr
上使用%%F (findstr /i "M002" %%F >nul 2>&1 )
并写入临时文本文件(如下所示)来测试和阅读它,但没有任何效果。
我做错了什么?
P.S。如果我从循环中删除它,代码可以正常工作,但由于最后一行,我需要在循环中使用它。
rem ===========================================
set FileType=pdf
for %%F in (%~dp0*.%FileType%) do (
rem ECHO %%F
echo "%%F" > test.txt
findstr /i "M002" test.txt >nul 2>&1
echo %errorlevel%
if not %errorlevel% == 0 (
echo "4pp"
echo %%F
set Output=4PP
) ELSE (
echo "Letter"
echo %%F
set Output=Letter
)
set NetComm="XYZ" "%Output%" etc etc etc
)
rem ====================================
答案 0 :(得分:1)
delayedexpansion
的第5,961代。
批处理从for
到最后一个右括号的整个语句,并在语句时将任何 %var%
替换为该变量的值被解析。
因此,尝试使用在循环内建立的值将失败。这适用于当前实例中的%output%
和%errorlevel%
。
轻松处理%errorlevel%
。语法
if errorlevel n
适用于errorlevel
的运行时值,如果errorlevel
设置为n
或更高,则为true比n
。
就个人而言,我发现if not condition ... else
笨拙。我不明白为什么它如此常见。在我的书中模糊思考......
有三种常见的方法可以克服这个问题,每种方法都有自己的优点和缺点,支持者和批评者。
首先,“记录”方法。使用setlocal enabledelayedexpansion
指令。执行此说明后,!var!
将访问当前值,并%var%
初始 value of
var`。
二,子程序方法。循环中的CALL :sub
执行子例程(请参阅文档 - 提示中的call /?
),在该子例程中,%var%
将具有在循环内建立的值。
第三,有时可以使用call echo %%var%%
(或call someotherinsruction
)call
执行目标,就像它是一个子程序一样。
因此,在您的情况下,修复可能是
rem ===========================================
set FileType=pdf
for %%F in (%~dp0*.%FileType%) do (
rem ECHO %%F
findstr /i "M002" "%%F" >nul 2>nul
CALL echo %%errorlevel%%
if errorlevel 1 (
echo "4pp"
echo %%F
set Output=4PP
) ELSE (
echo "Letter"
echo %%F
set Output=Letter
)
CALL set NetComm="XYZ" "%%Output%%" etc etc etc
)
rem ====================================
完全取决于你对“作品”的定义(这不是绝对的 - 它只对你有意义。)