检查for循环是否返回值批处理文件

时间:2017-04-12 05:28:51

标签: batch-file

我有下面的脚本,我循环在特定目录中的txt文件,我想只在返回任何txt文件时执行循环内部的内容。 我尝试使用IF NEQ但仍然输入循环,尽管此位置没有txt文件。

@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)

1 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
FOR %%I in (%cd%\*.pzk) DO (
echo ++%%I++
SET namepath=%%I
ECHO (%namepath%^)
CALL ECHO (%%namepath%%^)
IF [%namepath%] NEQ [""] (
echo entered
)
)
GOTO :EOF

奇迹般地,我在目录中没有名为*.pzk的文件,因此没有给出任何结果。

然后我设置了test.pzk,这就产生了

  

++ C:\ 106X \ test.pzk ++
  ()
  (C:\ 106X \ test.pzk)
  输入

因为我回复了2对+作为哨兵的名称,所以namepath的值与遇到for时的值相同(没有)然后通过调用echo,在(之前插入一个额外的空格(因为echoecho(的解释方式几乎相同),最后, entered因为[]确实不等于[""]

所以 - 您的一个问题是)中的echo (%namepath%)被解释为关闭(中的for...do (。因此,enteredecho编辑。

如果您对if %var%==somevalue goto somewhere进行编码,那么如果var为空,则会将其解析为if ==somevalue goto somewhere。 “引用这些论点”因此:if "%var%"=="somevalue" goto somewhere缓解了这种情况。 如果您对if %var%==somevalue goto somewhere进行编码,那么如果var为空,则会将其解析为if ==somevalue goto somewhere。 “引用这些论点”因此:if "%var%"=="somevalue" goto somewhere缓解了这种情况。要比较的字符串在所有方面必须相同才能被声明为“相等”。

您的代码:[请不要链接到非现场资源,因为它们可能会消失]

@ECHO OFF
SETLOCAL
FOR %%I in (%cd%txt*.txt) DO (
 SET namepath=%%I
 IF [%namepath%] NEQ [""] (
  SET name=%%~nxI
  SET folder=%cd%txt%name%
  CALL ECHO (%%folder%%^)
  CALL ECHO (%%namepath%%^)

  SET folder=%namepath:.trc=!""!%
  call set folder=%%namepath:.txt=%%
  CALL ECHO (%%folder%%^)
  md "%folder%" 2>nul
 )
)
GOTO :EOF

代码块(带括号的系列命令)在分析时进行评估,此时任何%var%被替换为该变量的值< em>当时。 DO (之前的整个程序)之前的匹配goto :eof 一个代码块,此过程将被应用在第一次遇到for时到整个区块。

如果您希望在代码块中访问变量的运行时值,则需要在{{delayedexpansion [有数百个关于此的SO项目]时调用%var% 1}} 仍然表示“解析时间值”,!var!表示“运行时值”,即。它在循环中变化的值。

请注意,call echo/set...语法会调用一个子进程,该进程继续使用当前环境的副本,因此具有运行时值主要过程。所以call echo %%var%%实际上执行了一个子流程,并使用%%的转义字符来执行子流程中的指令echo %var%的事实,即调用 ING 过程中{em>当前值var

FOR %%I in (%cd%txt*.txt) DO (

不确定你需要什么。 %cd%不包含终端\,因此这意味着“父目录名文本* .txt”。我相信这可能是您正在使用的第三方网站创建的错误。这里%cd%\.\相同,但在任何情况下都是多余的,因为当前目录是默认目录。

 IF [%namepath%] NEQ [""] (
除非 namepath包含值""(即两只兔子的耳朵),否则

始终将为真遇到 for 的时间

由于namepath在代码块中发生了变化,因此您需要!namepath!来访问运行时值,但实际上没有必要,因为namepath不能为空这一点 - %%I永远不会为空 - 如果没有匹配的文件,将跳过整个for代码块。

但是 - 当我们通过时,语法if defined namepath会检测到namepath nothing (即已清除) - {{ 1}}适用于变量的运行时值。

if defined

我不知道你打算在这做什么。它似乎想要用 SET folder=%namepath:.trc=!""!% 替换.trc - 但我没有概念为什么。 Rabbit的耳朵不是有效的文件/目录名字符,所以这似乎没有意义。在!""!模式中添加!是一个特殊字符的次要复杂功能,并且神秘感加深。

无论如何,你用下一个语句覆盖delayedexpansion的值。

现在 - 该声明应该用 nothing 替换任何folder。很公平,但.txt设置为namepath%%I循环正在过滤for个文件 - 所以这应该将.txt设置为仅名称部分folder%%I

你应该能够

%%~nI

完全消除了md "%%~nI" 2>nul 整个体操运动。