我有下面的脚本,我在特定的目录中循环txt文件,我想只执行任何txt文件返回时循环内部的内容。 我试过使用IF NEQ
,但仍然输入循环,虽然在这个位置没有txt文件。检查是否为循环返回值批处理文件
@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)
我有下面的脚本,我在特定的目录中循环txt文件,我想只执行任何txt文件返回时循环内部的内容。 我试过使用IF NEQ
,但仍然输入循环,虽然在这个位置没有txt文件。检查是否为循环返回值批处理文件
@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)
@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
,与前插入一个额外的空间(
(如echo
和echo(
在几乎相同的方式被解释),最后,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
设置为%%I
和for
循环正在筛选.txt
文件 - 所以这应该将folder
设置为仅%%I
或%%~nI
的名称部分。
而且你应该能够
md "%%~nI" 2>nul
这避免了与folder
完全整个体操锻炼; Tibial。
感谢这个有用的答案。还有一件事,如果我运行我的脚本在这里http://pasteall.org/348561我得到这个错误'命令的语法是不正确的.'调试后,我发现它来自这一行'如果不存在%文件夹% md%folder%'不知道为什么?我已经尝试使用mkdir,但也给出了相同的错误。 – Tak
始终“引用文件名和目录名”,以便如果它们包含分隔符,则整个名称将被解释为单个标记。不需要检查目录是否存在。只是'md“directoryname”',如果错误消息困扰你,'md“directoryname”2> nul',其中'2>'将错误消息重定向到*无处* – Magoo
我试过这个脚本http://pasteall.org/348649但由于某种原因,虽然'CALL ECHO(%%文件夹%% ^)'打印了正确的新文件夹路径,但是没有创建该文件夹,有什么想法? – Tak
你需要[延期扩展](https://ss64.com/nt/delayedexpansion.html) – npocmaka
@npocmaka我在开始时增加了'SETLOCAL EnableDelayedExpansion',但仍然输入循环,虽然没有.txt文件这个目录 – Tak
你想读取文本文件吗? – npocmaka