如何找到批处理文件的当前目录,然后将其用作路径?


70

我有一个批处理文件,打算分发给我们的客户以运行软件任务。

我们将它们作为文件夹或.zip内部文件进行分发。内部有批处理文件,另一个文件夹包含运行批处理所需的文件。

通常,进行批处理时,请键入文件所在的路径。但是我不知道文件在哪里。这些文件仍将保留在master文件夹中,但是我需要让批处理找到该文件夹​​来运行文件。

因此,例如:如果他们在桌面上拥有master文件夹并运行它,则它需要像 "C:\Users\Username\Desktop"运行。您会将批处理CD放到该位置。

但是,如果他们从文档运行该怎么办?我不知道用户名,所以我必须以某种方式让批处理找到它。任何代码和/或指令都很好。


它属于您,可以更恰当地描述您的问题。我不能理解你的意思。
Endoro

1
没关系,我最后一个问题(可能看不见,因为我删除了它。我弄清楚了。我必须在该行中添加“ / s”
Ryan Barber

Answers:


87

无需知道文件在哪里,因为当您启动bat文件时,工作目录是文件所在的目录(“主文件夹”),因此,如果您具有以下结构:

.\mydocuments\folder\mybat.bat
.\mydocuments\folder\subfolder\file.txt

然后用户启动“ mybat.bat”,工作目录为“。\ mydocuments \ folder”,因此您只需要在脚本中编写子文件夹名称:

@Echo OFF
REM Do anything with ".\Subfolder\File1.txt"
PUSHD ".\Subfolder"
Type "File1.txt"
Pause&Exit

无论如何,工作目录存储在“%CD%”变量中,启动bat的目录存储在参数0中。然后,如果您想知道任何计算机上的工作目录,可以执行以下操作:

@Echo OFF
Echo Launch dir: "%~dp0"
Echo Current dir: "%CD%"
Pause&Exit

29
错了 启动bat文件不会更改工作目录。只有在打开命令窗口,将当前目录更改为批处理脚本的目录,然后通过键入其名称来启动它时,才能保证此方法有效。另一种无效的方法是输入“ CD C:\ Temp”,然后输入“ C:\ Scripts \ MyScript.bat”。这将启动MyScript,bat,但是工作目录不会成为启动目录。以类似的方式,从Windows资源管理器启动批处理脚本不会自动更改工作目录。
christutty 2015年

2
有趣的事实:如果编写批处理脚本来删除一堆构建DLL,然后从资源管理器中运行它,它将作为文件在当前目录中运行。但是,如果由于“访问被拒绝”而无法删除生成DLL,并且尝试以管理员身份从资源管理器运行批处理脚本,它将在C:\ Windows \ System32中运行。然后删除DLL。
Sorensen

62

ElektroStudios的答案有点误导。

“启动bat文件时,工作目录就是启动目录。”如果用户在浏览器中单击批处理文件,则为true。

但是,如果使用CALL命令从另一个脚本调用了该脚本,则当前工作目录不会更改。

因此,在脚本中,最好使用%〜dp0subfolder \ file1.txt

另请注意,当当前脚本不在当前工作目录中时,%〜dp0将以反斜杠结尾。因此,如果您需要不带反斜杠的目录名称,则可以使用类似

call :GET_THIS_DIR
echo I am here: %THIS_DIR%
goto :EOF

:GET_THIS_DIR
pushd %~dp0
set THIS_DIR=%CD%
popd
goto :EOF

我也总是给人一种印象,即运行.bat文件时,无论它在哪里,“工作目录”都在其中。我今天发现事实并非如此。在新的PC上,我发现在bat文件中仅具有“ dir”命令不会显示bat文件所在的目录,而是其他目录。首先使用此处的pushd语句可以解决该问题。谢谢!
特拉维斯·劳德


8

批量尝试

set "batchisin=%~dp0"

应该将变量设置为批次的位置。


谢谢你的帮助。但是这些都不起作用。我的主要批次链接到同一主文件夹下但在子文件夹中的其他批次。当我在主要批次的菜单中键入数字时,它无法分配子文件夹中的BAT。
瑞安·巴伯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.