首先,我看到了这个主题,但我无法理解它。
问题:
在D:\path\to\file.bat
中有一个批处理文件,其内容如下:
echo %cd%
pause
输出结果为:
C:\
必须是D:\path\to
我做错了什么?
首先,我看到了这个主题,但我无法理解它。
问题:
在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
变量时,结果被括在引号内。
D:\Dir1\Dir2\stm.sql
中运行 stm.sql
。我需要 mysql.exe -u root -p mysql < %cd%\stm.sql
来执行那些 stm.sql 命令。 - Hamed Kamrava*.bat
或 *.sh
那样的批处理文件吗? - Stolegecho %0
可以显示批处理文件的完整路径,但我需要的是 D:\Dir1\Dir2\
而不是 D:\Dir1\Dir2\batchfile.bat
。 - Hamed Kamravaecho %~dp0
会返回批处理文件所在的路径。echo %~f0
会返回包含批处理文件名称的路径。 - Stoleg非常简单:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
,然后它就起作用了。 - mkb"%~dp0"
而不是%~dp0
。引号将确保路径被视为一个标记,即使存在空格,还可以防止像&
这样的毒害字符。 - dbenham在您的 .bat 文件中:
set mypath=%cd%
现在您可以使用变量%mypath%
来引用.bat
文件的文件路径。要验证路径是否正确:
@echo %mypath%
例如,一个名为DIR.bat
的文件,其内容如下。set mypath=%cd%
@echo %mypath%
Pause
从目录g:\test\bat
运行,将在DOS命令窗口中打印该路径。
%cd%
,无需先复制它。 - Rick这是我在所有批处理文件的顶部使用的内容。 我只需从我的模板文件夹中复制/粘贴即可。
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
将当前批处理文件的路径设置为%batdir%,可以在当前批处理文件中的后续语句中调用它,而不管此批处理文件更改到何处。 使用PUSHD允许您使用POPD快速将此批处理文件的路径设置为原始%batdir%。 请记住,如果使用%batdir%ExtraDir或%batdir%\ ExtraDir(取决于上面使用的版本,是否以反斜杠结尾),则如果路径包含空格,则需要将整个字符串括在双引号中(即“%batdir%ExtraDir”)。 您始终可以使用PUSHD%〜dp0。 [https://ss64.com/nt/syntax-args.html]有关(%〜)参数的更多信息。
请注意,在行首使用(::)将其变成注释行。 更重要的是,使用::允许您在该注释中包含重定向器、管道、特殊字符(即<>&|等)。
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
当然,PowerShell可以做到这些,而且还能做更多。set batdir=%CD%
)。这是不正确的,因为它是调用者的路径,而不是批处理文件本身的路径。获取正在执行的批处理文件路径的唯一有效方式是 %~dp0
。 - Mitch McMabers