Не удается вызвать дефрагментацию из сценария Perl в Windows 2008

Я хотел бы запустить Perl-скрипт, который запускает команду дефрагментации в Windows. Когда я пытаюсь просто использовать

system("defrag C:");

Я получаю сообщение «дефрагментация не является внутренней или внешней командой, исполняемой программой или пакетным файлом». Я получаю ту же ошибку, даже если указываю полный путь к 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?

Спасибо!

Крис

Обновление: изначально обратная косая черта не экранировалась. Фиксированный.


person Chris    schedule 15.08.2011    source источник
comment
Подсказка: в Perl-скрипте вы можете использовать косую черту для этих целых. То есть вы можете сказать if ( -f C:/Windows/System32/defrag.exe). Попробуйте C:/Windows/SysWow64/defrag.exe.   -  person David W.    schedule 16.08.2011


Ответы (3)


Более новые версии Windows (которые могут включать или не включать Windows Server 2008) виртуализируют определенные системные каталоги для исполняемых файлов, которые не были созданы с манифестом, указывающим иное.

Начиная с версии 5.12.0, Perl собирается с этой инструкцией.

perl.exe now includes a manifest resource to specify the trustInfo settings for Windows Vista and later. Without this setting Windows would treat perl.exe as a legacy application and apply various heuristics like redirecting access to protected file system areas (like the "Program Files" folder) to the users "VirtualStore" instead of generating a proper "permission denied" error.
person ikegami    schedule 15.08.2011

Вам нужно будет избежать обратной косой черты, чтобы они были распознаны как фактический разделитель каталогов:

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

Должно сработать.

person Linus Kleen    schedule 15.08.2011
comment
Виноват. Я на самом деле избегаю их в своем коде, просто забыл сделать это, когда печатал свой пост. В качестве обновления, если я вручную скопирую Defrag.exe из Windows\System32, я смогу запустить его из своего сценария. Я не могу скопировать его программно, поэтому похоже, что это может быть проблема с разрешениями. - person Chris; 16.08.2011

Я только что столкнулся с этой проблемой, пытаясь использовать psexec. Вероятно, вы столкнулись с перенаправителем системных файлов. Это как-то связано с резервированием каталога C:\Windows\System32 только для 64-битных программ, а 32-битные программы больше не могут выполнять 64-битные программы, а перенаправляются в каталог C:\Windows\SysWow64.

Это Microsoft для вас: 64-битные программы хранятся в C:\Windows\System32, а 32-битные программы хранятся в C:\Windows\SysWow64.

Я считаю, что Perl 5.12 должен решить эту проблему, но я обошел ее, просто скопировав программу из каталога C:\Windows\System32 в другой каталог.

person David W.    schedule 16.08.2011
comment
Перл 5.12 работал. Копирование файла дало мне эту ошибку: Кэш загрузчика ресурсов не имеет загруженной записи MUI. Понятия не имею, что это значит, и поиск в Google дал много ссылок на Norton, но я не думаю, что это вызывает это. - person Chris; 16.08.2011
comment
Понял, что я сказал, что копирование сработало в комментарии выше. Я должен уточнить, что это было на коробке коллеги 2008 года. Мой ящик выдал ошибку при копировании файла, поэтому для согласованности я буду использовать Perl 5.12 в качестве решения. - person Chris; 16.08.2011