Не удается вызвать дефрагментацию из сценария Perl в Windows 2008 - PullRequest
1 голос
/ 16 августа 2011

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

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?

Спасибо!

Chris

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

Ответы [ 3 ]

1 голос
/ 16 августа 2011

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

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

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

0 голосов
/ 16 августа 2011

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

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

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

0 голосов
/ 16 августа 2011

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

Начиная с 5.12.0, Perl создается сэта инструкция.

perl.exe теперь включает ресурс манифеста для указания параметров trustInfo для Windows Vista и более поздних версий.Без этого параметра Windows будет рассматривать perl.exe как унаследованное приложение и применять различные эвристические методы, такие как перенаправление доступа к защищенным областям файловой системы (например, к папке «Program Files») для пользователей «VirtualStore», вместо генерации правильной ошибки «отказано в разрешении».
...