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

Rya*_*ber 69 directory cd file batch-file find

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

我们将它们分发为文件夹或.zip内部文件.在里面,有批处理文件和另一个文件夹,其中包含运行批处理所需的文件.

通常,在创建批处理时,键入文件所在的路径.但我不知道文件在哪里.这些文件仍将保存在主文件夹中,但我需要让批处理找到该文件夹​​来运行文件.

例如:如果他们在桌面上有主文件夹并且运行它,则需要"C:\Users\Username\Desktop"运行.您可以将批处理CD放到该位置.

但如果他们从文件中运行呢?我不知道用户名,所以我必须以某种方式让批处理找到这个.任何代码和/或指令都会很棒.

Ele*_*ios 86

无需知道文件的位置,因为当您启动bat文件时,工作目录是启动它的目录("主文件夹"),所以如果你有这个结构:

.\mydocuments\folder\mybat.bat
.\mydocuments\folder\subfolder\file.txt
Run Code Online (Sandbox Code Playgroud)

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

@Echo OFF
REM Do anything with ".\Subfolder\File1.txt"
PUSHD ".\Subfolder"
Type "File1.txt"
Pause&Exit
Run Code Online (Sandbox Code Playgroud)

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

@Echo OFF
Echo Launch dir: "%~dp0"
Echo Current dir: "%CD%"
Pause&Exit
Run Code Online (Sandbox Code Playgroud)

  • 这是错的.启动bat文件不会更改工作目录.只有在打开命令窗口,将当前目录更改为批处理脚本的目录,然后键入其名称启动它时,才能保证这一点.一个不起作用的替代方法是输入"CD C:\ Temp"然后输入"C:\ Scripts\MyScript.bat".这将启动MyScript,bat但工作目录将不是启动目录.以类似的方式从Windows资源管理器启动批处理脚本不会自动更改工作目录. (24认同)
  • 有趣的事实:如果您编写批处理脚本来删除一堆构建DLL,然后从资源管理器运行它,它将作为文件在当前目录中运行.但是,如果您因为"访问被拒绝"而无法删除构建DLL,并且您尝试以管理员身份从资源管理器运行批处理脚本,则它将在C:\ Windows\System32中运行.然后删除DLL. (2认同)

小智 59

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
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 45

你也可以

 Pushd "%~dp0"
Run Code Online (Sandbox Code Playgroud)

这也需要考虑从unc路径运行.

  • 谢谢你; 与unc有问题. (2认同)

Mag*_*goo 7

尝试你的补丁

set "batchisin=%~dp0"
Run Code Online (Sandbox Code Playgroud)

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