我可能会将当前目录与工作目录混淆,但无论我是否尝试制作一个批处理文件,从当前所在的文件夹中运行tree
命令。
我有一个名为"Network_Switch_Backup"的文件夹,其中包含一个脚本,一些其他项目和一个名为"备份"的子文件夹。
这适用于测试目的:
tree U:DesktopNetwork_Switch_Backupbackups /f
但是,由于我将压缩它并将其发送到不同的计算机和用户,这显然是不切实际的,因为他们可以将文件夹放在桌面以外的任何地方。
我查看了其他线程,在我尝试过的其他事情中,这看起来是最有希望的(但仍然不起作用):
tree %cd%backups /f
但是,从cmd运行时tree %cd%downloads /f
工作正常,所以我有点困惑。
建议在批处理文件中引用可执行文件以使用完全限定文件名运行,这意味着完整路径 + 文件名 + 文件扩展名,尤其是在可执行文件的存储位置已知的情况下。这使得批处理文件独立于环境变量的值PATHEXT
和PATH
。 在许多运行 Windows 的计算机上,PATH
定义通常不正确。
TREE的完整限定名称为%SystemRoot%System32tree.com
。
环境变量SystemRoot
不像PATH
和PATHEXT
那样定义为系统或用户环境变量,而是在执行批处理文件时定义的。因此,使用此 Windows 环境变量非常安全。
"..."的原因是什么?无法识别为内部或外部命令、可操作程序或批处理文件?非常详细地解释了 Windows 命令处理器如何在命令提示符下或在批处理文件中查找未使用完全限定文件名指定的可执行文件和脚本。
在编写应用程序或脚本时需要考虑两个目录:
- 应用程序/脚本目录是包含程序或脚本的目录。 当前目录或
- 工作目录是从中执行程序或脚本的目录。
例如,批处理文件存储在目录"%UserProfile%Desktop"
中。Windows将批处理文件的目录设置为当前目录,只需双击用户桌面上的批处理文件即可。因此,脚本目录是执行批处理文件时的当前目录。但是,如果通过右键单击批处理文件并左键单击上下文菜单选项"以管理员身份运行"来执行此批处理文件,则存储在"%UserProfile%Desktop"
中的批处理文件通常从目录%SystemRoot%System32
执行,具体取决于用户帐户权限和当前用户的用户帐户控制设置。在执行批处理文件之前%SystemRoot%System32
当前目录的原因在为什么"以管理员身份运行"更改(有时)批处理文件的当前目录?
MSDN 文章命名文件、路径和命名空间详细介绍了如何引用相对于当前目录的文件和文件夹。当前目录根本不包含在文件/文件夹参数字符串中,或者由.
表示。
如果需要知道当前目录的驱动器和路径,例如要在运行批处理文件时输出它,则有动态环境变量CD
(当前目录的缩写)。 启用了延迟扩展的%CD%
或!CD!
将扩展到当前目录的完整路径,该路径不以反斜杠结尾,但当前目录是驱动器的根目录。在命令提示符窗口中运行时的帮助输出set /?
在上一个帮助页面上简要解释了动态环境变量CD
。
批处理文件需要经常设计为引用具有相对于批处理文件目录的路径的文件或文件夹。在这种情况下,不建议使用当前目录,因为当前目录实际上可以是任何目录。
在命令提示符窗口中运行call /?
的帮助输出说明了如何从批处理文件中引用批处理文件的参数。参数 0 始终是批处理文件本身。
%~dp0
引用批处理文件的驱动器和路径。此文件路径始终以反斜杠结尾,但当然可以包含一个空格或这些字符之一&()[]{}^=;!'+,`~
这需要整个文件/文件夹参数字符串括在双引号中。因此,%~dp0
必须在批处理文件中连接,在该字符串后没有额外的反斜杠,并且整个参数字符串必须括在双引号中才能安全工作。
因此,用于引用子目录的命令行Backups
在批处理文件的目录中,与当前目录所在的目录无关:
%SystemRoot%System32tree.com "%~dp0Backups" /F
cmd.exe
错误详细解释在 %~dp0 引用的批处理文件路径的原因是什么,有时更改目录时会发生变化? 在批处理文件中使用%~dp0
时应考虑。