1

我想运行一个在 Windows 上运行 defrag 命令的 perl 脚本。当我尝试使用

system("defrag C:");

我得到“'defrag' 未被识别为内部或外部命令、可运行程序或批处理文件”。即使我给出了 C:\Windows\System32\defrag.exe 的完整路径,我也会得到同样的错误。此外,任何对 defrag.exe 是否存在的测试都会失败。例如:

if(-f "C:\\Windows\\System32\\defrag.exe"),

if(-x "C:\\Windows\\System32\\defrag.exe"), and

if(-e "C:\\Windows\\System32\\defrag.exe")

都失败了。事实上,它们在测试任何 .exe 文件时都会失败。这在 Windows 2003 上运行良好,有谁知道为什么它不再在 Windows 2008 上运行?

谢谢!

克里斯

更新:反斜杠最初没有转义。固定的。

4

3 回答 3

1

您需要转义反斜杠,以便将它们识别为实际的目录分隔符:

if(-f "C:\\Windows\\System32\\defrag.exe")

应该管用。

于 2011-08-15T20:36:33.887 回答
0

较新版本的 Windows(可能包括也可能不包括 Windows Server 2008)虚拟化某些系统目录以用于未使用清单指示构建的可执行文件。

从 5.12.0 开始,Perl 就是使用这条指令构建的。

perl.exe 现在包含一个清单资源,用于指定 Windows Vista 及更高版本的 trustInfo 设置。如果没有此设置,Windows 会将 perl.exe 视为遗留应用程序,并应用各种启发式方法,例如将对受保护文件系统区域(如“程序文件”文件夹)的访问重定向到用户“VirtualStore”,而不是生成正确的“权限被拒绝”错误.
于 2011-08-15T21:52:03.150 回答
0

我只是在尝试使用psexec. 您可能会受到SystemFile Redirector的打击。它与仅为 64 位程序保留 C:\Windows\System32 目录有关,32 位程序不能再执行 64 位程序,而是重定向到 C:\Windows\SysWow64 目录。

这就是你的微软:64 位程序存储在 C:\Windows\System32 中,而 32 位程序存储在 C:\Windows\SysWow64 中。

我相信 Perl 5.12 应该可以解决这个问题,但我只是通过将程序从 C:\Windows\System32 目录复制到另一个目录来解决这个问题。

于 2011-08-16T02:02:24.930 回答