我想运行一个在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?
谢谢!
克里斯
更新:反斜杠最初未进行转义。固定的。
答案 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目录复制到另一个目录。