ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Windows 中获取批处理脚本的路径?

我知道 %0 包含批处理脚本的完整路径,例如 c:\path\to\my\file\abc.bat

我会 path 等于 c:\path\to\my\file

我怎么能做到这一点?

顺便说一句:如果使用相对命令行调用 bat,则 %0 不包含完整路径。所以“%~dpf0”在这种情况下会更可靠。

j
jurl

%~dp0 将是目录。 Here's some documentation on all of the path modifiers。好玩的东西 :-)

要删除最后的反斜杠,您可以使用 :n,m 子字符串语法,如下所示:

SET mypath=%~dp0
echo %mypath:~0,-1%

不幸的是,我不相信有办法将 %0 语法与 :~n,m 语法结合起来。


太好了...我一直在使用%~0\..——知道必须有更好的方法!此外,您可能需要将 %~dp0 括在双引号 ("") 中,以防目录名称中包含空格等。
即使路径中有空格,答案中的示例也可以在没有引号的情况下正常工作。 (例如 SET msg=hello world 工作正常)。但是,当在其他地方使用 %mypath% 时,您要小心在引号中使用它,尽管 cd 也不需要它们。
这些无法组合是“不幸的”,因为世界肯定需要更多的%~dp0:~0,-1$。仍然 - 非常好的答案。
而不是删除尾随反斜杠,您只需要在末尾添加一个 .。它的工作方式与当前目录 SET mypath=%~dp0. 完全相同
如果尾随反斜杠干扰,只需附加一个点 .;不要像您那样删除 \ ,因为当脚本位于驱动器的根目录中时,这会导致意外的相对路径,因为 D:\ (绝对)和 D:(相对)可能指向不同的位置,取决于当前的工作目录,但 D:\. 仍然是绝对的……
d
dss539

%~dp0 可能是相对路径。要将其转换为完整路径,请尝试以下操作:

pushd %~dp0
set script_dir=%CD%
popd

好的,那为什么不直接使用 %~dp0 呢?
我想这是为了解决已接受答案的评论中提到的问题而发布的——%~dp0 可以是相对的,这可能是也可能不是问题,具体取决于用例
%~dp0 不能包含相对路径,d 代表驱动器,p 代表路径,驱动器怎么可能是相对的?
在哪个世界?我刚刚在 Windows Server 2012 r2 上测试了这个答案,结果发现 %~dp0 将是一个绝对路径,即使脚本作为相对路径运行也是如此。感谢jeb的评论,我没有被这个答案愚弄。为什么人们只是编造一些东西,然后开始向他人传播他们疯狂的想象力。我有一位这样做的同事,但我责怪他(年轻)的年龄。我希望我的反对票能算数。
d
duan

您可以使用以下脚本来获取路径,而无需尾随“\”

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

不过,这不会从路径中删除文件名(例如 OP 示例中的 abc.txt)。
@dcp 呃,不过确实如此。
@Kyle Strand - 是的,我又试了一次,现在工作正常。我不确定我最初尝试时发生了什么,也许我在脚本的某个地方犯了错误。很抱歉造成混乱,并感谢您指出。
A
Adir D

%~dp0 - 返回执行脚本的路径

但是,重要的是要知道以下一个:%CD% - 在运行时返回当前路径,例如,如果您使用“cd folder1”进入其他文件夹,然后使用“cd folder2”,它将返回完整路径,直到 folder2 和不是脚本所在的原始路径


H
Hayz

您可以使用 %~dp0,d 表示仅驱动器,p 表示仅路径,0 是批处理文件的完整文件名的参数。

例如,如果文件路径是 C:\Users\Oliver\Desktop\example.bat,那么参数将等于 C:\Users\Oliver\Desktop\,您也可以使用命令 set cpath=%~dp0 && set cpath=%cpath:~0,-1% 并使用 %cpath% 变量删除尾部斜杠。


我看不到比 9 岁的答案更多的信息
额外信息是“d 仅表示驱动器,......”等。谢谢你,@Hayz。
除非您使用 delayed expansion...
A
Azametzin

%cd% 将为您提供运行脚本的目录路径。

赶紧跑:

echo %cd%

%CD% 是当前工作文件夹,而不是存储批处理文件的文件夹。它们可以在同一个位置,但通常不是。
R
Ruel

那将是 %CD% 变量。

@echo off
echo %CD%

%CD% 返回批处理脚本所在的当前目录。


%cd% 返回运行脚本的目录,而不是脚本所在的目录。
它仅在您的脚本不修改工作目录时才有效。试试 CD C:\Temp <CR> ECHO %CD%<CR> 是换行符...)
此外,如果您右键单击脚本并选择“以管理员身份运行”,则无论脚本位于何处,起始当前目录都是 C:\Windows\System32。
虽然它不是对 OP 问题的直接回答,但这种功能的味道正是我在发现这个问题时所寻找的。谢谢!
在 Win7 32bit cmd.exe 上发布的其他解决方案似乎都不适合我,这至少对我有用。