我可能将当前目录与工作目录混淆了,但是无论我试图从当前所在的文件夹中创建一个运行if.request.method == 'POST'
命令的批处理文件。
我有一个名为“ Network_Switch_Backup”的文件夹,其中包含一个脚本,一些其他项目以及一个名为“ backups”的子文件夹。
这已用于测试目的:
tree
但是,由于我将其压缩并发送到其他计算机和用户,显然这是不切实际的,因为他们可以将文件夹放置在桌面以外的任何位置。
我查看了其他线程,并尝试了其他方法,这看起来是最有前途的(但仍然没有用):
tree U:\Desktop\Network_Switch_Backup\backups /f
但是tree %cd%\backups /f
在从cmd运行时可以很好地工作,所以我有点困惑。
答案 0 :(得分:2)
建议在批处理文件中引用可执行文件以完整的合格文件名运行,这意味着完整路径+文件名+文件扩展名,尤其是在可执行文件的存储位置众所周知的情况下。这使批处理文件独立于环境变量PATHEXT
和PATH
的值。在许多运行Windows的计算机上,PATH
常常定义不正确。
树的完全限定名称为%SystemRoot%\System32\tree.com
。
环境变量SystemRoot
未被定义为系统或 user 环境变量,例如PATH
和PATHEXT
,但仍被定义在执行批处理文件时。因此,使用此Windows environment variable是非常安全的。
What is the reason for '...' is not recognized as an internal or external command, operable program or batch file?非常详细地介绍了Windows命令处理器如何在命令提示符下或批处理文件中查找未使用完整限定文件名指定的可执行文件和脚本。
在编写应用程序或脚本时,需要考虑两个目录:
例如,批处理文件存储在目录"%UserProfile%\Desktop"
中。 Windows只需双击用户桌面上的批处理文件,即可将批处理文件的目录设置为当前目录。因此,脚本目录是执行批处理文件时的当前目录。但是,如果通过右键单击该批处理文件并右键单击上下文菜单选项以管理员身份运行来执行此批处理文件,则通常从目录{{1 }},取决于用户帐户权限和当前用户的用户帐户控制设置。通过执行Why does 'Run as administrator' changes (sometimes) batch file's current directory?
"%UserProfile%\Desktop"
设置为当前目录的原因。
MSDN文章Naming Files, Paths, and Namespaces详细解释了如何引用相对于当前目录的文件和文件夹。当前目录根本不包含在文件/文件夹参数字符串中,或者由%SystemRoot%\System32
表示。
如果需要知道当前目录的驱动器和路径,例如在运行批处理文件时将其输出,则存在动态环境变量%SystemRoot%\System32
(Current Directory的缩写)。启用了delayed expansion的.\
或CD
会扩展到当前目录的完整路径,该路径不以反斜杠结尾,但当前目录是驱动器的根目录。在命令提示符窗口%CD%
中运行时获得的帮助输出在上一个帮助页面上简要说明了动态环境变量!CD!
。
批处理文件通常需要设计为引用具有相对于批处理文件目录的路径的文件或文件夹。在这种情况下,建议不要使用当前目录,因为当前目录实际上可以是任何目录。
在命令提示符窗口中运行set /?
时的帮助输出说明了如何从批处理文件中引用批处理文件的参数。参数0始终是批处理文件本身。
CD
引用批处理文件的驱动器和路径。该文件路径始终以反斜杠结尾,但是当然可以包含空格或这些字符call /?
之一,这些字符需要将整个文件/文件夹参数字符串括在双引号中。因此,%~dp0
必须串联在一个批处理文件中,并且在该字符串后没有其他反斜杠,并且整个参数字符串都必须用双引号引起来,以确保安全工作。
因此,用于引用批处理文件目录中的子目录&()[]{}^=;!'+,`~
的命令行独立于当前目录是
%~dp0
在批处理文件中使用Backups
时,应考虑到What is the reason for batch file path referenced with %~dp0 sometimes changes on changing directory?上详细解释的%SystemRoot%\System32\tree.com "%~dp0Backups" /F
错误。