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

Posted

技术标签:

【中文标题】如何找到批处理文件的当前目录,然后将其用作路径?【英文标题】:How do I find the current directory of a batch file, and then use it for the path? 【发布时间】:2013-04-21 17:37:26 【问题描述】:

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

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

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

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

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

【问题讨论】:

有责任更恰当地描述您的问题。我无法理解你的观点。 没关系我的最后一个问题(可能不可见,因为我删除了它。我想通了。我必须在行中添加一个“/s” 【参考方案1】:

不需要知道文件在哪里,因为当你启动一个 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

【讨论】:

这是错误的。启动 bat 文件不会更改工作目录。仅当您打开命令窗口,将当前目录更改为批处理脚本的目录,然后通过键入其名称来启动它时,才能保证此功能有效。另一个不起作用的方法是输入“CD C:\Temp”,然后输入“C:\Scripts\MyScript.bat”。这将启动 MyScript,bat 但工作目录不会是启动目录。以类似的方式从 Windows 资源管理器启动批处理脚本不会自动更改工作目录。 有趣的事实:如果你编写一个批处理脚本来删除一堆构建 DLL,然后从资源管理器中运行它,它将作为文件运行在当前目录中。但是,如果您因为“拒绝访问”而无法删除构建 DLL,并且您尝试以管理员身份从资源管理器运行批处理脚本,它将在 C:\Windows\System32 中运行。然后删除 DLL。【参考方案2】:

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

【讨论】:

我也一直认为“工作目录”就是运行 .bat 文件时所在的位置。我今天发现这不是真的。在一台新电脑上,我发现在 bat 文件中简单地使用“dir”命令不会显示 bat 文件所在的目录,而是显示其他目录。在这里使用 pushd 语句首先解决了这个问题。谢谢!【参考方案3】:

你也可以这样做

 Pushd "%~dp0"

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

【讨论】:

当蝙蝠以管理员身份启动时,这对我有用【参考方案4】:

批量尝试

set "batchisin=%~dp0"

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

【讨论】:

感谢您的所有帮助。但这些都不起作用。我的主要批次链接到同一主文件夹下的其他批次,但在子文件夹中。当我在主批处理菜单中输入数字时,无法启动子文件夹中的BAT。

以上是关于如何找到批处理文件的当前目录,然后将其用作路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用批处理文件更改当前工作目录

#### 批处理命令 获取当前目录下所有文件的路径

“查找:路径必须在表达式之前:”如何指定在当前目录中也可以找到文件的递归搜索?

如何在ffmpeg中使用字节而不是文件路径?

如何在java中获取执行目录路径[重复]

批处理如何实现删除当前目录内最近修改时间3天以外的所有文件?