Powershell, работающий под сервисом, висит на * .zip CopyHere - PullRequest
5 голосов
/ 12 января 2010

Я использую службу Windows (Hudson), которая, в свою очередь, порождает процесс PowerShell для запуска моих пользовательских команд PowerShell. Часть моего сценария - распаковать файл с помощью CopyHere. Когда я запускаю этот скрипт локально, я вижу диалоговое окно прогресса, когда файлы извлекаются и копируются. Однако, когда он запускается под службой, он зависает в том месте, где в противном случае могло бы появиться диалоговое окно.

Вот распакованная часть моего сценария.

# Extract the contents of a zip file to a folder
function Extract-Zip {
    param([string]$zipFilePath, [string]$destination)
    if(test-path($zipFilePath))     {   
        $shellApplication = new-object -com shell.application

        $zipFile = get-item $zipFilePath
        $zipFolder = $shellApplication.NameSpace($zipFile.fullname)

        $destinationFile = get-item $destination
        $destinationFolder = $shellApplication.NameSpace($destinationFile.fullname)

        $destinationFolder.CopyHere($zipFolder.Items())
    }
}

Я подозреваю, что, поскольку он работает в процессе обслуживания, который происходит без головы (без взаимодействия с рабочим столом), он как-то застрял при попытке отобразить диалоговое окно.

Есть ли способ обойти это?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2014

Если это все еще актуально, мне удалось это исправить, имея параметры CopyHere, равные 1564.

Так что в моем случае функция извлечения zip выглядит так:

    function Expand-ZIPFile{
    param(
    $file, $destination
    )
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file)
    foreach($item in $zip.items())
    {
    $shell.Namespace($destination).copyhere($item,1564)
    "$($item.path) extracted"
    }

1564 описание можно найти здесь - http://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx:

(4) Не отображать диалоговое окно хода выполнения.
(8) Присвойте файлу, работающему с новым именем, операцию перемещения, копирования или переименования, если файл с целевым именем уже существует.
(16) Ответьте «Да всем» для любого отображаемого диалогового окна.
(512) Не подтверждайте создание нового каталога, если операция требует его создания.
(1024) Не отображать интерфейс пользователя в случае ошибки.

2 голосов
/ 12 января 2010

Если это работает в Vista или Windows 7, то, как вы подозревали, конечный пользователь не увидит всплывающий пользовательский интерфейс из службы. См. Этот документ на Сессия 0 Изоляция . Тем не менее, диалог прогресса требует ввода данных пользователем? Если нет, я не думаю, что это приведет к зависанию службы. Я бы искал вариант отключить отображение прогресса. Если вы не можете найти это, попробуйте переключиться на другой ZIP-экстрактор. PSCX 1.2 поставляется с командлетом Expand-Archive. Я уверен, что есть и другие доступные.

1 голос
/ 12 января 2010

Глядя на документацию для PowerShell, похоже, здесь может помочь -NonInteractive

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...