如何安全地将文件名附加到Windows文件夹路径参数?

dbe*_*ham 7 windows cmd batch-file

假设我有一个批处理脚本,需要参数中的文件夹路径%1.我想在路径中附加一个文件名,并在命令中使用它.是否有一种简单的方法可以在所有情况下以可靠的方式执行此操作?

我不PUSHD %1想也不想忽视之后的路径.假设我的逻辑要求当前目录保持不变.

问题是%1论证可能有也可能没有终止反斜杠 - 即c:\pathc:\path\.

通常我可以简单地使用,"%~1\file.ext"因为Windows对待"c:\path\file.ext""c:\path\\file.ext"相同.

但有一个令人讨厌的案例 - c:\

以下命令会产生此错误: The filename, directory name, or volume label syntax is incorrect.

dir "c:\\file.ext"
del "c:\\file.ext"
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这些命令工作正常:

if exist "c:\\file.ext" echo OK
echo text>"c:\\file.ext"
copy "c:\\file.ext" "somePath"
xcopy "c:\\file.ext" "somePath"
Run Code Online (Sandbox Code Playgroud)

还有另一个有问题的情况 - c:意味着驱动器C:上的当前目录,如果我附加一个反斜杠,将给出错误的结果."c:file.ext"是不一样的"c:\file.ext".

有没有一种简单的方法可以安全地将文件名附加到任何给定的文件夹路径参数?

我并不关心UNC路径,因为我不经常使用它们,我相信有一些命令与UNC路径不相称.

注意:这是我发布配对问题和答案的情况.这个问题多年来一直是我的一个棘手问题,我最近发现了一个我认为其他人可能感兴趣的简单解决方案.

dbe*_*ham 7

编辑 - 答案已更改为解决MC ND的评论

解决方案很简单:-) "%~f1.\file.ext"

Windows文件名不能以.或结尾<space>,因此所有Windows命令都会忽略尾随.<space>文件/文件夹名称.

.反斜杠后面的单个代表该位置的当前目录.

假设当前工作目录是c:\test,那么下表显示了如何解析各种值:

"%~1"        | "%~f1.\file.ext"       | equivalent to
-------------+------------------------+------------------------
"c:\folder\" | "c:\folder\.\file.ext" | "c:\folder\file.ext"
             |                        |
"c:\folder"  | "c:\folder.\file.ext"  | "c:\folder\file.ext"
             |                        |
"c:\"        | "c:\.\file.ext"        | "c:\file.ext"
             |                        |
"c:"         | "c:\test.\file.ext"    | "c:\test\file.ext"
             |                        |
"."          | "c:\test.\file.ext"    | "c:\test\file.ext"
             |                        |
".."         | "c:\.\file.ext"        | "c:\file.ext"
             |                        |
<no value>   | "c:\test.\file.ext"    | "c:\test\file.ext"  I hadn't thought of this case
                                                            until I saw MC ND's answer
Run Code Online (Sandbox Code Playgroud)

您可以使用FOR循环轻松地将表达式缩减为规范等效形式:

for %%A in ("%~f1.\file.ext") do echo "%%~fA"
Run Code Online (Sandbox Code Playgroud)

正如Harry Johnston在评论中所述,此解决方案不适用于UNC根路径(\\server\shareName)或长路径(\\?\c:\somePath).如果您需要支持其中任何一种情况,请参阅MC ND的答案.在哈利·约翰斯顿的答案是简单的,但它不支持任何给定参数的情况下.