无法在Windows 2008上从perl脚本调用碎片整理

时间:2011-08-15 20:31:29

标签: perl windows-server-2008-r2 defragmentation

我想运行一个在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?

谢谢!

克里斯

更新:反斜杠最初未进行转义。固定的。

3 个答案:

答案 0 :(得分:1)

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

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

应该工作。

答案 1 :(得分:0)

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

自5.12.0起,Perl就是用这条指令构建的。

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

答案 2 :(得分: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目录复制到另一个目录。