为什么我们不能“以管理员身份运行”路径中带有@的批处理文件?

为什么我们不能“以管理员身份运行”路径中带有@的批处理文件?

所以我们刚刚发现了这个奇怪的怪癖。很容易避免,但好奇这里的专家是否知道发生了什么。

似乎如果您尝试在路径中包含空格和 @ 符号的批处理文件上使用右键单击“以管理员身份运行”,它将无法启动。它可以在正常上下文中运行,或者在您之前提升的命令提示符中运行良好,但是这组特定情况会导致它毫无意义地失败。

我在网上搜索了一下,唯一能找到的其他参考资料是一篇名为 CapnM 的用户的帖子,其中遇到了类似的问题并发现了同样的问题 -2015 年

如果目标路径同时包含符号 (@) 和空格,则文件资源管理器中的右键单击以管理员身份运行功能将失败。

例如这些路径有效:

D:\foo\bar\foobar\  
D:\foo\bar\foo bar\  
D:\@foo\bar\foobar\   
D:\@foo\bar@\foobar\

但这些会阻止目标(批处理文件)运行:

D:\@foo\bar\foo bar\  
D:\foo\bar\@foo bar\

这是否只是一个 4 年多来一直未修复的错误?

答案1

这里出现问题的 Windows 代码可能源自 DOS 的早期版本。它在处理特殊字符时确实很乱。

如果您想要另一个示例,请创建一个名为的文件D:\foo\file(.bat并尝试使用 CMD 运行它,不需要管理员权限。以下是发生的情况:

在此处输入图片描述

在上面的例子中,在 CMD 命令中,括号分隔了命令,因此就好像您正在C:\foo\file(.bat第一个参数运行该程序一样。

从这里可以看出,古老的 CMD 代码是在文件名更简单且允许使用非字母数字字符时编写的。

您在“以管理员身份运行”时遇到的问题可能与相同的古老代码有关。 用于的命令runas在注册表中的键中定义 HKEY_CLASSES_ROOT\batfile\shell\runas\command,并包含:

%SystemRoot%\System32\cmd.exe /C "%1" %*

发出“以管理员身份运行”命令后,CMD 就会运行该命令,我们知道它不能很好地处理特殊字符。微软从未发布过相关代码,因此我们无法评论其编写得有多糟糕。

相关内容