首先,我看到这个话题,但我不能理解。
问题:
在“D:\path\to\file.bat”目录下有一个批处理文件,内容如下:
echo %cd%
pause
输出为:
C:\
必须是D:\path\to
我做错了什么?
首先,我看到这个话题,但我不能理解。
问题:
在“D:\path\to\file.bat”目录下有一个批处理文件,内容如下:
echo %cd%
pause
输出为:
C:\
必须是D:\path\to
我做错了什么?
当前回答
非常简单:
setlocal
cd /d %~dp0
File.exe
其他回答
非常简单:
setlocal
cd /d %~dp0
File.exe
系统只读变量%CD%保存批处理调用者的路径,而不是批处理文件的位置。
您可以获得用户使用%0键入的批处理脚本本身的名称(例如scripts\mybatch.bat)。参数扩展可以应用于此,因此%~dp0将返回批处理脚本的驱动器和路径(例如W:\scripts\), %~f0将返回完整的路径名(例如W:\scripts\mybatch.cmd)。
你可以使用下面的语法引用与批处理脚本相同文件夹中的其他文件:
CALL %0\..\SecondBatch.cmd
这甚至可以在子例程中使用,Echo %0将给出调用标签,但是Echo“%~nx0”将为您提供批处理脚本的文件名。
当展开%0变量时,结果用引号括起来。
更多关于批参数的信息。
以下是我在所有批处理文件顶部使用的内容。我只是从模板文件夹中复制/粘贴。
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Setting current batch file's path to %batdir% allows you to call it in subsequent stmts in current batch file, regardless of where this batch file changes to. Using PUSHD allows you to use POPD to quickly set this batch file's path to original %batdir%. Remember, if using %batdir%ExtraDir or %batdir%\ExtraDir (depending on which version used above, ending backslash or not) you will need to enclose the entire string in double quotes if path has spaces (i.e. "%batdir%ExtraDir"). You can always use PUSHD %~dp0. [https: // ss64.com/ nt/ syntax-args .html] has more on (%~) parameters.
注意,在一行的开头使用(::)将使其成为注释行。更重要的是,使用::允许你在注释中包含重定向器、管道、特殊字符(例如< > |等)。
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
当然,Powershell可以做到这一点,还有很多其他功能。
在你的。bat文件中:
set mypath=%cd%
现在可以使用变量%mypath%来引用.bat文件的文件路径。验证路径是否正确:
@echo %mypath%
例如,一个名为DIR.bat的文件,其中包含以下内容
set mypath=%cd%
@echo %mypath%
Pause
从目录g:\test\bat运行将在DOS命令窗口中返回该路径。