Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何找到批处理文件的当前目录,然后将其用作路径?_File_Batch File_Directory_Find_Cd - Fatal编程技术网

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

File 如何找到批处理文件的当前目录,然后将其用作路径?,file,batch-file,directory,find,cd,File,Batch File,Directory,Find,Cd,我有一个批处理文件,我打算分发给我们的客户以运行软件任务 我们将它们作为文件夹或.zip分发,其中包含文件。里面有批处理文件和另一个文件夹,其中包含运行批处理所需的文件 通常,在进行批处理时,键入文件所在的路径。但我不知道文件在哪里。这些文件仍将保存在主文件夹中,但我需要让批处理程序找到该文件夹才能运行这些文件 例如:如果他们在桌面上有主文件夹并运行它,那么它需要类似于“C:\Users\Username\desktop”才能运行。您可以将批处理CD放到该位置 但是如果他们从文档中运行它呢?我不

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

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

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

例如:如果他们在桌面上有主文件夹并运行它,那么它需要类似于
“C:\Users\Username\desktop”
才能运行。您可以将批处理CD放到该位置

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

在批处理中尝试

set "batchisin=%~dp0"
它应该将变量设置为批次的位置。

您也可以这样做

 Pushd "%~dp0"

这还需要考虑从unc路径运行。

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

ElektroStudios的答案有点误导

“启动bat文件时,工作目录是启动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。它属于您,用于更正确地描述您的问题。我不能接受你的观点。不要介意我的最后一个问题(可能因为我删除了它而不可见。我想出来了。我必须添加一个“/s”这是错误的。启动bat文件不会更改工作目录。只有在打开命令窗口,将当前目录更改为批处理脚本的目录,然后通过键入其名称来启动时,才能保证此操作有效。另一种不起作用的方法是输入“CD C:\Temp”,然后输入“C:\Scripts\MyScript.bat”。这将启动MyScript,bat,但工作目录将不是启动目录。类似地,从Windows资源管理器启动批处理脚本不会自动更改工作目录。有趣的事实:如果您编写批处理脚本来删除一组生成DLL,然后从资源管理器运行,它将作为fi在当前目录中运行但是,如果您因为“访问被拒绝”而无法删除生成DLL,并且您尝试以管理员身份从资源管理器中运行批处理脚本,它将在C:\Windows\System32中运行。然后删除DLL。我还一直认为“工作目录”当你运行.bat文件时,它在哪里。我今天发现这不是真的。在一台新电脑上,我发现只有一个“dir”bat文件中的命令不会显示bat文件所在的目录,而是其他目录。在这里使用pushd语句首先解决了这个问题。谢谢!当bat以管理员身份启动时,这对我很有效