Batch file 为什么在FOR循环中使用通配符模式*.xls指定相对路径的目录中找到的文件的完整路径是错误的?

Batch file 为什么在FOR循环中使用通配符模式*.xls指定相对路径的目录中找到的文件的完整路径是错误的?,batch-file,windows-7,Batch File,Windows 7,我有一个批处理文件,用Java应用程序的通配符模式处理为找到的每个Excel文件: for %%i in ("../test data/sprint4/*.xls") do ( @echo "%%~fi" ) 例如,我正在从运行此批处理文件 C:\dir1\dir2\dir3 这就是文件 C:\dir1\dir2\test data\sprint4\myfile.xlx 完整路径的输出文件名为 C:\dir1\dir2\myfile.xls 测试数据\sprint4在路径中丢失,

我有一个批处理文件,用Java应用程序的通配符模式处理找到的每个Excel文件:

for %%i in ("../test data/sprint4/*.xls") do (
    @echo "%%~fi"
)
例如,我正在从运行此批处理文件

C:\dir1\dir2\dir3
这就是文件

C:\dir1\dir2\test data\sprint4\myfile.xlx
完整路径的输出文件名为

C:\dir1\dir2\myfile.xls
测试数据\sprint4
在路径中丢失,我不确定出了什么问题

有人建议使用
/?
,但当我使用
echo/?
时,信息量非常有限:

echo/?
显示消息,或打开或关闭命令回显

回声[开|关]
回声[信息]

键入不带参数的ECHO以显示当前的ECHO设置

这并不能解释通配符的用法。搜索也无济于事。所以现在我被卡住了


为什么在上面为循环使用通配符模式*.xls指定相对路径的目录中找到Excel文件的完整路径是错误的?

对窗口路径使用反斜杠,而不是正斜杠

for %%i in ("..\test data\sprint4\*.xls") do (
    @echo "%%~fi"
)

在命令提示窗口中运行/?以获取此命令的多个显示页面的详细帮助

Windows上的目录分隔符是
\
,而不是
/
,因此Windows命令解释器经常(但不总是)使用更正了这一点,因为从命令提示符中运行批处理文件时可以看到这一点,因为命令解释器会将解析命令行命令块后实际处理的内容打印到控制台。在这种情况下,斜杠不会自动更正为反斜杠,从而导致找到的文件路径错误

但是,
的命令的完整路径查找有时无法按照相对路径的预期工作。所讨论的代码就是一个例子

解决方案1使用预定义的环境变量CD,该变量包含当前目录的路径,除当前目录是驱动器的根目录外,不以反斜杠结尾,该驱动器不能在此处出现

for %%i in ("%CD%\..\test data\sprint4\*.xls") do (
    @echo "%%~fi"
)
当前目录可以与批处理文件的目录不同

解决方案2使用批处理文件的驱动器和路径,该批处理文件由
%~dp0
引用,因此该路径始终以反斜杠结束

for %%i in ("%~dp0..\test data\sprint4\*.xls") do (
    @echo "%%~fi"
)

在命令提示窗口中运行
call/?
以获取有关
%~dp0
的详细信息,
set/?
以获取有关CD和其他预定义环境变量的详细信息

解决方案3使用相对路径,但带有反斜杠:

for %%i in ("..\test data\sprint4\*.xls") do (
    @echo "%%~fi"
)

现在,找到的*.xls文件的名称始终具有正确的完整路径。

正如其他人所指出的,您应该使用
\
而不是
/
,这就解决了您的问题

至于
/
失败的原因。。。 有许多上下文
/
起作用,有些上下文不起作用,有些上下文似乎起作用,但给出了错误的结果。看

您发现了另一种情况,它“起作用”,但给出了错误的结果。问题是
%%i
在使用
/
时只提供找到的文件名和扩展名,因此当您使用
%%~fi
请求完整路径时,它使用当前目录,您会得到错误的结果

for %%i in ("../test data/sprint4/*.xls") do @echo "%%i" --^> "%%~fi"
收益率:

"myfile.xlx" -->  "C:\dir1\dir2\test data\sprint4\myfile.xlx"
"..\test data\sprint4\myfile.xlx" --> "C:\dir1\dir2\test data\sprint4\myfile.xlx"
但如果切换到反斜杠,则会保留原始的相对路径,因此
%%~fi
会给出正确的结果:

for %%i in ("..\test data\sprint4\*.xls") do @echo "%%i" --^> "%%~fi"
收益率:

"myfile.xlx" -->  "C:\dir1\dir2\test data\sprint4\myfile.xlx"
"..\test data\sprint4\myfile.xlx" --> "C:\dir1\dir2\test data\sprint4\myfile.xlx"

在我的机器上,如果我的路径至少包含一个
\
,我似乎可以通过FOR循环得到正确答案。但我不会相信这一点,因为有。最好养成在任何情况下都使用
\
的习惯。

我想这只是我在unix/linux背景下的心理问题,\n总是转义字符;-)这在java中是一个大问题。有时你必须使用\\\\\。但是cmd是不同的,所以我将用\