批处理脚本错误 - 文件名 Returns 与实际文件名不同
Batch Script Bug - Filename Returns Different then actual Filename
我的代码
我有一个非常奇怪的错误,我终其一生都无法解决。下面是示例代码的快速片段:
set myFolder=\myPath\myFolder
set myRootFilename=*myFilenameRoot*.txt
IF NOT EXIST "%myFolder%\%myRootFilename%" GOTO next
FOR /R "%myFolder%" %%F IN (%myRootFilename%) DO (
set filenameWithExt=%%~nxF
)
echo %filenameWithExt%
pause
:next
echo doesn't exist
pause
第 1 期 - "Random String"
预期结果
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160422.txt
实际结果
我已经在至少 20 个其他项目中使用过此代码,并且运行良好。然而,在这种情况下,我得到这样的结果:
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
randomSTRING_myFilenameRoot_20140926.txt
我不知道 "randomSTRING" 是从哪里生成的,也不知道新日期是从哪里来的?!这几乎就像它在文件夹中找到了另一个文件(任何时候都只有一个或两个文件)。但是,当我从文件夹中手动删除 myFilenameRoot_20160422.txt 文件时...... "IF NOT EXIST" 代码开始运行。
问题 2 - 文件夹刷新?
为了让事情变得更奇怪,我决定简单地从设置字符串的开头删除通配符,即:
set myRootFilename=myFilenameRoot*.txt
这解决了我的 "Random String" 问题。但是,现在它返回了一个包含昨天日期的文件!
预期结果
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160422.txt
实际结果
我已经在至少 20 个其他项目中使用过此代码,并且运行良好。然而,在这种情况下,我得到这样的结果:
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160421.txt
它在哪里找到这个文件名?好问题,因为我不知道。所以我从文件夹中删除了文件,然后再次 运行 批处理。再一次,"IF NOT EXIST" 逻辑开始了。
所以我将文件放回文件夹中,运行 再次批处理 - 这次实际结果与预期结果相符...成功!对吗?
不...为了最后一次测试批次,我将文件名更改为:
myFilenameRoot_20160422.txt
到
myFilenameRoot_20170422.txt
运行 再次批处理...但这次它呼应了旧结果:
myFilenameRoot_20160422.txt
无数次冲洗并重复上述故障排除步骤。我不知道它在哪里/为什么找到这些替代文件名!有人知道发生了什么事吗?
如有任何帮助,我们将不胜感激!
感谢@aschipfl 在评论中的回答。我只需要调整 FOR 循环...
原始破损代码:
FOR /R "%myFolder%" %%F IN (%myRootFilename%) DO ()
新增功能代码:
FOR %%F IN ("%myFolder%\%myRootFilename%") DO ()
我的代码
我有一个非常奇怪的错误,我终其一生都无法解决。下面是示例代码的快速片段:
set myFolder=\myPath\myFolder
set myRootFilename=*myFilenameRoot*.txt
IF NOT EXIST "%myFolder%\%myRootFilename%" GOTO next
FOR /R "%myFolder%" %%F IN (%myRootFilename%) DO (
set filenameWithExt=%%~nxF
)
echo %filenameWithExt%
pause
:next
echo doesn't exist
pause
第 1 期 - "Random String"
预期结果
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160422.txt
实际结果
我已经在至少 20 个其他项目中使用过此代码,并且运行良好。然而,在这种情况下,我得到这样的结果:
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
randomSTRING_myFilenameRoot_20140926.txt
我不知道 "randomSTRING" 是从哪里生成的,也不知道新日期是从哪里来的?!这几乎就像它在文件夹中找到了另一个文件(任何时候都只有一个或两个文件)。但是,当我从文件夹中手动删除 myFilenameRoot_20160422.txt 文件时...... "IF NOT EXIST" 代码开始运行。
问题 2 - 文件夹刷新?
为了让事情变得更奇怪,我决定简单地从设置字符串的开头删除通配符,即:
set myRootFilename=myFilenameRoot*.txt
这解决了我的 "Random String" 问题。但是,现在它返回了一个包含昨天日期的文件!
预期结果
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160422.txt
实际结果
我已经在至少 20 个其他项目中使用过此代码,并且运行良好。然而,在这种情况下,我得到这样的结果:
文件夹中的文件:
myFilenameRoot_20160422.txt
批量回显显示:
myFilenameRoot_20160421.txt
它在哪里找到这个文件名?好问题,因为我不知道。所以我从文件夹中删除了文件,然后再次 运行 批处理。再一次,"IF NOT EXIST" 逻辑开始了。
所以我将文件放回文件夹中,运行 再次批处理 - 这次实际结果与预期结果相符...成功!对吗?
不...为了最后一次测试批次,我将文件名更改为:
myFilenameRoot_20160422.txt
到
myFilenameRoot_20170422.txt
运行 再次批处理...但这次它呼应了旧结果:
myFilenameRoot_20160422.txt
无数次冲洗并重复上述故障排除步骤。我不知道它在哪里/为什么找到这些替代文件名!有人知道发生了什么事吗?
如有任何帮助,我们将不胜感激!
感谢@aschipfl 在评论中的回答。我只需要调整 FOR 循环...
原始破损代码:
FOR /R "%myFolder%" %%F IN (%myRootFilename%) DO ()
新增功能代码:
FOR %%F IN ("%myFolder%\%myRootFilename%") DO ()