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
Windows 获取当前批处理文件目录_Windows_Batch File_Working Directory - Fatal编程技术网

Windows 获取当前批处理文件目录

Windows 获取当前批处理文件目录,windows,batch-file,working-directory,Windows,Batch File,Working Directory,首先,我看到了,但我不明白 问题: D:\path\to\file.bat中有一个包含以下内容的批处理文件: echo %cd% pause 输出为: C:\ 它必须是D:\path\to 我做错了什么?系统只读变量%CD%保留批处理调用方的路径,而不是批处理文件位置 您可以获得用户用%0键入的批处理脚本本身的名称(例如scripts\mybatch.bat)。可应用于此,因此%~dp0将返回批处理脚本的驱动器和路径(例如W:\scripts\),而%~f0将返回完整路径名(例如W:\scr

首先,我看到了,但我不明白

问题:

D:\path\to\file.bat中有一个包含以下内容的批处理文件:

echo %cd%
pause
输出为:

C:\
它必须是
D:\path\to


我做错了什么?

系统只读变量
%CD%
保留批处理调用方的路径,而不是批处理文件位置

您可以获得用户用
%0
键入的批处理脚本本身的名称(例如
scripts\mybatch.bat
)。可应用于此,因此
%~dp0
将返回批处理脚本的驱动器和路径(例如
W:\scripts\
),而
%~f0
将返回完整路径名(例如
W:\scripts\mybatch.cmd

您可以使用以下语法引用与批处理脚本位于同一文件夹中的其他文件:

CALL %0\..\SecondBatch.cmd
这甚至可以在子例程中使用,
Echo%0
将给出调用标签,但是,
Echo“%~nx0”
将给出批处理脚本的文件名

展开
%0
变量时,结果用引号括起来

.

非常简单:

setlocal
cd /d %~dp0
File.exe
在.bat文件中:

set mypath=%cd%
现在可以使用变量
%mypath%
将文件路径引用到
.bat
文件。要验证路径是否正确,请执行以下操作:

@echo %mypath%
例如,一个名为
DIR.bat
的文件包含以下内容

set mypath=%cd%
@echo %mypath%
Pause

从目录
g:\test\bat运行将在DOS命令窗口中回显该路径。

以下是我在所有批处理文件顶部使用的内容。我只是从我的模板文件夹复制/粘贴

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
将当前批处理文件的路径设置为%batdir%允许您在当前批处理文件的后续STMT中调用它,而不管此批处理文件更改为何处。使用PUSHD允许您使用POPD将此批处理文件的路径快速设置为原始%batdir%。请记住,如果使用%batdir%ExtraDir或%batdir%\ExtraDir(取决于上面使用的版本,是否结束反斜杠),如果path有空格(即%batdir%ExtraDir”),则需要将整个字符串括在双引号中。您始终可以使用PUSHD%~dp0。[https://ss64.com/nt/syntax args.html]有更多关于(%~)参数的信息

请注意,在行首使用(::)将使其成为注释行。更重要的是,使用::允许您在该注释中包含重定向器、管道、特殊字符(即<>|等)

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

当然,Powershell可以做到这一点,而且还有很多其他功能。

你应该阅读一个问题的所有答案,尤其是那些得票率较高的人,而不仅仅是那些被接受的人。在您发布的链接中得分最高的答案已经回答了您的问题。如果您在c:\s中键入批处理文件名,则c:\s是%cd%将打印的内容。看,我不需要在
D:\Dir1\Dir2\stm.sql
中运行
stm.sql
。我需要
mysql.exe-u root-p mysql<%cd%\stm.sql
来执行stm.sql命令。@HamedKamrava它是用于我的sql批处理的吗?不是像
*.bat
*.sh
?@Stoleg这样的批处理文件-事实上,在
D:\Dir1\Dir2\batchfile.bat
D:\Dir1\Dir2\stm.sql
中有两个文件。batchfile.bat内容是:
mysql.exe-u root-p mysql
和stm.sql内容是一些mysql命令。系统只读变量%CD%保留批处理调用方的路径,而不是批处理文件位置。
echo%~dp0
将返回批处理位置的路径
echo%~f0
将返回文件名为的批的路径。代码很短,但不容易理解。这个File.exe是什么?当前目录路径是否存储在%dp0中?我认为,这个答案实际上回答了这个问题。太好了。我刚刚用了
cd/d%~dp0
作为批处理文件的第一行,并且worked@T.Todua“setlocal”会导致任何环境更改,包括在批处理文件结束或遇到“endlocal”之前包含当前目录。如果要更改环境变量或当前目录,最好使用
“%~dp0”
而不是
%~dp0
。引号将保证路径作为一个令牌,即使有空格,并且还可以防止有毒字符,如
&
。这是最好、最简单的解决方案。这不是一个好的解决方案,因为它没有考虑从另一路径上的另一个文件调用的批处理脚本。另外,当以提升权限运行时,%cd%返回C:\Windows\system32,但不返回它所在的目录存储。此外,您可以只使用
%cd%
。无需先复制。回答得很好,非常感谢!:-)只要小心你的第二个技巧(
设置batdir=%CD%
)。这不好,因为它是调用方的路径,而不是bat文件本身。获取执行bat文件路径的唯一有效方法是
%~dp0