gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:05:23 26 4
gpt4 key购买 nike

假设我有一个批处理脚本,需要参数 %1 中的文件夹路径。我想将文件名附加到路径并在命令中使用它。有没有一种在所有情况下都可靠的简单方法来做到这一点?

我不想PUSHD %1 并在之后忽略该路径。假设我的逻辑要求当前目录保持不变。

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

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

但有一种情况很糟糕 - c:\

以下命令会产生此错误:文件名、目录名或卷标语法不正确。

dir "c:\\file.ext"
del "c:\\file.ext"

奇怪的是,这些命令工作得很好:

if exist "c:\\file.ext" echo OK
echo text>"c:\\file.ext"
copy "c:\\file.ext" "somePath"
xcopy "c:\\file.ext" "somePath"

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

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

我不关心 UNC 路径,因为我不经常使用它们,而且我相信有些命令不适合 UNC 路径。

注意:在这种情况下,我将发布成对的问题和答案。这个问题多年来一直困扰着我,我最近才发现一个简单的解决方案,我认为其他人可能会对它感兴趣。

最佳答案

编辑 - 答案已更改以解决 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

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

for %%A in ("%~f1.\file.ext") do echo "%%~fA"

正如 Harry Johnston 在他的评论中所述,此解决方案不适用于 UNC 根路径 ( \\server\shareName ) 或长路径 ( \\?\c:\somePath )。参见 MC ND's answer如果您需要支持其中任何一种情况。 Harry Johnston answer比较简单,但是不支持没有给出参数的情况。

关于windows - 如何安全地将文件名附加到 Windows 文件夹路径参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com