2017-04-12 59 views
0

我有下面的脚本,我在特定的目录中循环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

你需要[延期扩展](https://ss64.com/nt/delayedexpansion.html) – npocmaka

+0

@npocmaka我在开始时增加了'SETLOCAL EnableDelayedExpansion',但仍然输入循环,虽然没有.txt文件这个目录 – Tak

+0

你想读取文本文件吗? – npocmaka

回答

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)
输入

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

所以 - 之一您的问题是echo (%namepath%)中的)被解释为在for...do (中关闭(。因此,entered将会是echo ed。

如果您的代码为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 

代码块(parenthesised系列命令)在分析时进行评估,此时任何%var%被这个变量的值代替。通过其在goto :eof之前匹配)整个程序DO (一个码块并首先遇到的for当此过程将被应用到该整个块。

如果你想一个代码块中访问变量的运行时值,你需要调用delayedexpansion [有数百篇关于这个SO项目]当%var%仍然意味着“分析时值“和!var!的意思是”运行时间值“,即。该值随着它在循环中的变化而变化。

。注意,句法call echo/set...调用的子处理,其与当前环境的副本进行,因此具有运行时的主处理的值。所以call echo %%var%%实际执行一个子进程,并使用的事实,%%转义字符的子过程,这是var呼叫ING过程中当前值执行指令echo %var%

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

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

IF [%namepath%] NEQ [""] (

总是将是真正的除非namepath包含在该for遇到时的值""(即两只兔子的耳朵)

由于namepath正在代码块内变化,你需要!namepath!这里访问的运行时间值,但它确实没有必要,因为namepath不能在这一点上是空的 - %%I将永远是空的 - 整个如果没有匹配的文件,则for代码块将被跳过。

但是 - 当我们穿过,语法if defined namepath将检测namepath什么(即清零) - if defined作品的变量运行时值。

SET folder=%namepath:.trc=!""!% 

我不知道你打算在这里做什么。它似乎要.trc!""! - 但我没有概念为什么。兔子的耳朵不是有效的文件/目录名字符,所以这似乎没有意义。加入!delayedexpansion模式中的特殊字符,并且神秘程度加深。

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

现在 - 该声明应取代.txt没有任何。公平的,但namepath设置为%%Ifor循环正在筛选.txt文件 - 所以这应该将folder设置为仅%%I%%~nI的名称部分。

而且你应该能够

md "%%~nI" 2>nul 

这避免了与folder完全整个体操锻炼; Tibial。

+0

感谢这个有用的答案。还有一件事,如果我运行我的脚本在这里http://pasteall.org/348561我得到这个错误'命令的语法是不正确的.'调试后,我发现它来自这一行'如果不存在%文件夹% md%folder%'不知道为什么?我已经尝试使用mkdir,但也给出了相同的错误。 – Tak

+1

始终“引用文件名和目录名”,以便如果它们包含分隔符,则整个名称将被解释为单个标记。不需要检查目录是否存在。只是'md“directoryname”',如果错误消息困扰你,'md“directoryname”2> nul',其中'2>'将错误消息重定向到*无处* – Magoo

+0

我试过这个脚本http://pasteall.org/348649但由于某种原因,虽然'CALL ECHO(%%文件夹%% ^)'打印了正确的新文件夹路径,但是没有创建该文件夹,有什么想法? – Tak