我有下面的脚本,我循环在特定目录中的txt文件,我想只在返回任何txt文件时执行循环内部的内容。
我尝试使用IF NEQ
但仍然输入循环,尽管此位置没有txt文件。
@ECHO OFF
FOR %%I in (%cd%\txt\*.txt) DO (
SET namepath=%%I
echo(%namepath%)
IF [%namepath%] NEQ [""] (
echo entered
)
)
答案 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
,在(
之前插入一个额外的空格(因为echo
和echo(
的解释方式几乎相同),最后, entered
因为[]
确实不等于[""]
所以 - 您的一个问题是)
中的echo (%namepath%)
被解释为关闭(
中的for...do (
。因此,entered
将echo
编辑。
如果您对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
整个体操运动。