首先,我看到了这个话题,但我听不懂。
题 :
D:\path\to\file.bat
包含以下内容的批处理文件:
echo %cd%
pause
输出为:
C:\
一定是 D:\path\to
我究竟做错了什么?
首先,我看到了这个话题,但我听不懂。
题 :
D:\path\to\file.bat
包含以下内容的批处理文件:
echo %cd%
pause
输出为:
C:\
一定是 D:\path\to
我究竟做错了什么?
Answers:
系统只读变量%CD%
保留批处理调用方的路径,而不保留批处理文件的位置。
您可以使用%0
(例如scripts\mybatch.bat
)获得用户键入的批处理脚本本身的名称。可以将参数扩展名应用于此,因此%~dp0
会将驱动器和路径返回到批处理脚本(例如W:\scripts\
),%~f0
并返回完整的路径名(例如W:\scripts\mybatch.cmd
)。
您可以使用以下语法在与批处理脚本相同的文件夹中引用其他文件:
CALL %0\..\SecondBatch.cmd
这甚至可以在子例程中使用,Echo %0
将提供调用标签,但是echo "%~nx0"
将提供批处理脚本的文件名。
当%0
变量被扩展,结果是包含在引号。
stm.sql
参加D:\Dir1\Dir2\stm.sql
。我需要 mysql.exe -u root -p mysql < %cd%\stm.sql
执行该stm.sql命令。
*.bat
或*.sh
?
D:\Dir1\Dir2\batchfile.bat
和D:\Dir1\Dir2\stm.sql
。batchfile.bat的内容是:mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
和stm.sql的内容是一些MySQL命令。
echo %~dp0
将路径返回到批次位置。echo %~f0
将返回带有文件名的批处理路径。
在您的.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%可以使您在当前批处理文件的后续stmts中调用它,而不管此批处理文件更改到何处。使用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%
)。这不行,因为它是调用方的路径,而不是bat文件本身。获取执行bat文件路径的唯一有效方法是%~dp0
。