71

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

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

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

例如:如果他们在桌面上有主文件夹并且他们运行它,它需要像"C:\Users\Username\Desktop"运行一样。您将拥有该位置的批处理 CD。

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

4

4 回答 4

86

不需要知道文件在哪里,因为当你启动一个 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
于 2013-04-27T19:15:15.030 回答
64

ElektroStudios 的回答有点误导。

“当您启动 bat 文件时,工作目录是启动它的目录”如果用户单击资源管理器中的批处理文件,这是正确的。

但是,如果使用 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
于 2013-10-29T17:29:02.333 回答
47

你也可以做

 Pushd "%~dp0"

这也考虑了从 unc 路径运行。

于 2013-04-27T18:07:08.067 回答
8

批量尝试

set "batchisin=%~dp0"

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

于 2013-04-27T17:54:46.633 回答