Win Batch - 如果在文件名搜索中存在%date% - 不工作

时间:2017-10-18 12:19:47

标签: batch-file

我这个小脚本无效:

set actdate=%date:~6,4%%date:~3,2%%date:~0,2%
set source="\\somewhere\APPL\Logs"
set target="C:\TEMP\nebu_%actdate%.log"
echo %actdate%
if exist "%source%\*%actdate%*.txt" (
    echo vorhanden
    echo %source%\*%actdate%*.txt
) else (
    echo Nicht vorhanden
)

当我运行脚本时,我得到以下输出:

20171018
vorhanden
"\\somewhere\APPL\Logs"\*20171018*.txt
Nicht vorhanden

现在的问题是,源中没有*20171018*.txt的文件:

NeBuExport.20171017.102600.txt
NeBuExport.20171016.080552.txt
NeBuExport.20171013.093638.txt

这里有什么问题?

2 个答案:

答案 0 :(得分:2)

Squashman用他的评论击中了头部 - 你的意外行为是你的作业中引用的结果,再加上源路径中的空格。实际上,如果您的路径包含=,;<space>

等任何令牌分隔符,则可能会出现此问题

假设您的来源分配为set source="\\some path\APPL\Logs"。来源的值为"\\some path\APPL\Logs",包括引号。

然后您的IF语句扩展为:

if exist ""\\some path\APPL\Logs"\*20171018*.txt" (

由于引号加倍,因此未引用空格,因此将单个标记视为两个标记。

IF测试""\\some是否存在,如果存在,则尝试执行以下伪造命令:

path\APPL\Logs"\*20171018*.txt"

(被视为bogus命令的参数,而不是代码块的开头。

当然""\\some不存在,因此不会执行bogus命令,也不会收到任何错误消息。

现在应该明白为什么所有三个ECHO语句都会执行。

最后一个“谜”是) else ()语句不会产生任何错误的原因。这是因为如果没有任何活动的括号代码块要关闭,)有效地用作REM这一事实。 )之后的所有文字都会被忽略,就像评论一样。

如果您按照Squashman的建议巧妙地更改了源代码的定义,那么您的代码应按预期运行:

set "source=\\some path\APPL\Logs"

现在你的价值变为\\some path\APPL\Logs,没有引号,一切正常: - )

答案 1 :(得分:0)

终于奏效了:

set "actdate=%date:~6,4%%date:~3,2%%date:~0,2%"
set "source=\\somewhere\APPL\Nebu Agent\Logs"
set "target=C:\TEMP\nebu_%actdate%.log"

if exist "%source%\*%actdate%*.txt" (
    echo "vorhanden"
) else (
    echo "Nicht vorhanden"
)

它也需要if语句中的引号 感谢所有人:)