一个 IF 语句,用于检查并执行 Windows 批处理文件中每个设置变量的命令

Posted

技术标签:

【中文标题】一个 IF 语句,用于检查并执行 Windows 批处理文件中每个设置变量的命令【英文标题】:An IF statement that checks and executes a command per each set variables in a windows batch file 【发布时间】:2021-05-19 09:09:46 【问题描述】:

更新说明: 我有一个主批处理文件,根据执行时使用的参数,它使用子例程批处理脚本分支出来。因此,我需要帮助获取一些预设值的名称(仅名称,即 TRIMAPP1、TRIMAPP2 等)并将它们用作上述子例程脚本的值。 在某种程度上,Stephan 建议的内容(%%a 值)可以为我提供名称,但我需要能够同时使用每个结果。

SET TRIMAPP1=APP1
SET TRIMAPP2=APP2
SET TRIMAPP3=APP3
SET TRIMAPP4=APP4
SET TRIMAPP5=APP5

if [%1%]==[TRIMMER] GOTO ONE 
if not [%1%]==[2] GOTO NEXTSECTION 

:ONE
for /f "tokens=1,* delims==" %%a in ('set TRIMAPP') do echo var %%a

...然后需要对 %%a 的每个结果运行以下命令

SET BACKUP DIRECTORY=C:\bkp\”%%a” 
SET LOG DIRECTORY=C:\log\”%%a”_Logs
CALL C:\TRIM\TRIMMER.exe.

我期待……

SET BACKUP DIRECTORY=C:\bkp\TRIMAPP1
SET BACKUP DIRECTORY=C:\bkp\TRIMAPP2
SET BACKUP DIRECTORY=C:\bkp\TRIMAPP3
SET BACKUP DIRECTORY=C:\bkp\TRIMAPP4
SET LOG DIRECTORY=C:\log\TRIMAPP1_Logs
SET LOG DIRECTORY=C:\log\TRIMAPP2_Logs
SET LOG DIRECTORY=C:\log\TRIMAPP3_Logs
SET LOG DIRECTORY=C:\log\TRIMAPP4_Logs

我希望这有助于更好地理解。很抱歉造成混乱,感谢您的耐心等待。谢谢!

【问题讨论】:

for /f "tokens=1,* delims==" %%a in ('set TRIMAPP') do echo var %%a has value %%b 应该会给你一个好的开始。遗憾的是,您的其余代码让我感到困惑,所以如果您需要更多帮助,请更清楚。 我在您提供的代码中没有看到IF 语句。我也看不到TRIMPAPP 变量在其余代码中的作用。这些变量不会在其余代码中使用。 能否请您重新审视您的问题,并edit 它以使您的任务和问题清晰且可回答。目前它没有意义,到目前为止提供的 cmets 和答案都在猜测您的意图。为了让这个站点为您提供帮助,我们需要能够复制您的环境、任务和代码。目前我们不能这样做,所以你的问题是题外话。请使用tour,并通读How to Ask 的所有页面,以了解您需要什么,以获得我们网站的最佳体验;谢谢。 【参考方案1】:

当没有等号时,SET 命令的行为可能对您有所帮助。从SET/?,我们可以看到

SET 命令仅使用变量名调用,没有等号或值将显示前缀与给定 set 命令的名称匹配的所有变量的值。

因此,运行SET TRIMAPP 会得到:

TRIMAPP1=APP1
TRIMAPP2=APP2
TRIMAPP3=APP3
TRIMAPP4=APP4
TRIMAPP5=APP5

FOR 命令可用于迭代命令的输出。使用"TOKENS=1,* DELIMS==" 将在第一个等号之前和之后拆分输出,因此:

FOR /F "TOKENS=1,* DELIMS==" %%A IN ('SET TRIMAPP') DO (
    REM PERCENT-A CONTAINS THE NAME OF THE VARIABLE
    REM PERCENT-B CONTAINS THE VALUE OF THE VARIABLE
    ECHO.Variable %%A has the value %%B.
)

将打印

Variable TRIMAPP1 has the value APP1.
Variable TRIMAPP2 has the value APP2.
Variable TRIMAPP3 has the value APP3.
Variable TRIMAPP4 has the value APP4.
Variable TRIMAPP5 has the value APP5.

【讨论】:

【参考方案2】:

根据我从您的解释中收集到的信息,您试图使用一个参数来搜索一组关联变量以查找与所述参数匹配的值。

您可以使用@Stephen 已经提到的方法并将其作为部分答案重新散列以将输出传送到 Findstr,然后如果使用&& 找到字符串,则有条件地执行其他命令。示例:

For /f "tokens=1* Delims==" %%G in ('Set "TRIMMAPP"')Do (
 Echo(%%H|%__AppDir__%findstr.exe /LIC:"Str" && (
  Echo(%%G = %%H
 )
)

为了将上述方法用于不同的搜索字符串,您可以通过使用标签并使用搜索字符串的参数调用标签来使其成为函数。 通过使用 2 个参数,您可以增加可重用性以允许与其他变量/变量组一起使用

@Echo off

SET TRIMAPP1=APP1
SET TRIMAPP2=APP2
SET TRIMAPP3=APP3
SET TRIMAPP4=APP4
SET TRIMAPP5=APP5

For %%i in (2 4)Do Call :FindVal TRIMAPP %%i
Pause
Exit /B 0

:FindVal <Variable prefix> <Search Value>
For /f "tokens=1* Delims==" %%G in ('Set "%~1"')Do (
 Echo("%%H"|%__AppDir__%findstr.exe /LIC:"%~2" > nul && (
  Echo(%%G = %%H
 )
)
Exit /B 0

请注意,findstr 的使用应根据您搜索的是包含该值的匹配项还是包含该值的匹配项来调整。

【讨论】:

【参考方案3】:
for /F "tokens=1*delims==" %%p IN ('set TRIMAPP') DO (
 echo %%%%.p=%%~p %%%%.q=%%~q ^<^<
 SET BACKUP DIRECTORY=C:\bkp\%%p 
 SET LOG DIRECTORY=C:\log\%%pLogs
 CALL C:\TRIM\TRIMMER.exe
)

看不到%%q 中的变量%%p 的值适合的位置。

常规注意事项:%%%%.p 显示为 %%.p,因为 %%%%p 不明确。这可能意味着 escaped-%escaped-% 或 escaped-%valueofmetavariable p :(

【讨论】:

以上是关于一个 IF 语句,用于检查并执行 Windows 批处理文件中每个设置变量的命令的主要内容,如果未能解决你的问题,请参考以下文章

检查执行if语句的时间

条件检查时如何一次停止执行if语句?

javascript中连续if语句的执行顺序

执行命令并在if语句中进行比较

用于检查 char 数组是不是包含 Java 中用户给定字母的 if 语句

如何在javascript中执行if语句来检查JSON数组是不是为空?