344

首先,我看到了这个主题,但我无法理解。

问题 :

有一个批处理文件,D:\path\to\file.bat内容如下:

echo %cd%
pause

输出是:

C:\

肯定是D:\path\to

我究竟做错了什么?

4

4 回答 4

583

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

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

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

CALL %0\..\SecondBatch.cmd

这甚至可以在子程序中使用,Echo %0会给出调用标签,但echo "%~nx0"会给你批处理脚本的文件名。

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

更多关于批处理参数

于 2013-06-12T11:13:54.277 回答
148

很简单:

setlocal
cd /d %~dp0
File.exe
于 2014-09-08T07:26:11.620 回答
43

在您的 .bat 文件中:

set mypath=%cd%

您现在可以使用该变量%mypath%来引用文件的文件路径.bat。验证路径是否正确:

@echo %mypath%

例如,DIR.bat使用以下内容调用的文件

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

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

于 2015-09-02T17:19:06.023 回答
14

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

@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 可以做到这一点以及更多。

于 2019-02-17T07:23:01.313 回答