Start-Process -NoNewWindow в Start-Job?

У меня возникают проблемы с использованием Start-Process в Start-Job, особенно при использовании -NoNewWindow. Например, этот тестовый код:

Start-Job -scriptblock {
    Start-Process cmd -NoNewWindow -Wait -ArgumentList '/c', 'echo' | out-null
    Start-Process cmd # We'll never get here
}

get-job | wait-job | receive-job
get-job | remove-job

Возвращает следующую ошибку, о которой Google, по-видимому, не слышал:

Receive-Job: при обработке данных из фонового процесса произошла ошибка. Сообщается об ошибке: не удается обработать элемент с типом узла "Текст". Поддерживаются только типы узлов Element и EndElement.

Если я уберу -NoNewWindow, все будет работать нормально. Я делаю что-то глупое, или нет возможности запустить задания, содержащие Start-Process -NoNewWindow? Есть хорошие альтернативы?


person Joe    schedule 11.07.2014    source источник
comment
Извините, используя PowerShell 4.0, я не могу воспроизвести проблему. Все работает хорошо.   -  person JPBlanc    schedule 11.07.2014
comment
Хм, может быть, это ответ - что-то сломалось в 2.0, и я должен обновиться. Я бы предпочел придерживаться 2.0, если это возможно, только потому, что у меня нет контроля над всеми средами, в которых я хотел бы работать.   -  person Joe    schedule 11.07.2014
comment
Нет, прими это как есть: это комментарий. Просто чтобы люди не теряли время на тестирование PowerShell 4.0.   -  person JPBlanc    schedule 11.07.2014
comment
@joe Ты когда-нибудь это понимал? У нас такая же проблема. Я еще не пробовал обновиться до powershell 4.0.   -  person Brad    schedule 27.05.2017
comment
Я думаю, что в итоге мы использовали более новую версию Powershell. Но этот код был заменен другими вещами много лет назад, поэтому я больше не могу быть уверен.   -  person Joe    schedule 27.07.2017
comment
привет, ты нашел корень проблемы здесь? такая же проблема с пс5   -  person Dimitrie Mititelu    schedule 11.09.2017
comment
@DimitrieMititelu Похоже на дубликат для stackoverflow.com/q/45764330. Я дал свой ответ здесь.   -  person user4003407    schedule 21.10.2017
comment
@PetSerAl, и здесь есть обходной путь (спасибо вам): stackoverflow.com/a/43350250/67824   -  person Ohad Schneider    schedule 07.03.2019


Ответы (1)


Немного поздно, но для людей, у которых все еще есть проблемы с этим конкретным сообщением об ошибке, одним из исправлений для этого примера является использование -WindowStyle Hidden вместо -NoNewWindow, у меня было -NoNewWindow, которое часто игнорировалось и вызывало свои собственные проблемы.

Но для этой конкретной ошибки, которая, кажется, возникает из-за использования Start-Process с различными исполняемыми файлами, я нашел решение, которое, кажется, работает последовательно, путем перенаправления вывода, поскольку именно возвращаемый вывод, по-видимому, вызывает проблему. К сожалению, это приводит к записи во временный файл и его очистке.

В качестве примера;

Start-Job -ScriptBlock {
    # Create a temporary file to redirect output to.
    [String]$temporaryFilePath = [System.IO.Path]::GetTempFileName()

    [HashTable]$parmeters = @{
        'FilePath' = 'cmd';
        'Wait' = $true;
        'ArgumentList' = @('/c', 'echo');
        'RedirectStandardOutput' = $temporaryFilePath;
    }
    Start-Process @parmeters | Out-Null

    Start-Process -FilePath cmd

    # Clean up the temporary file.
    Remove-Item -Path $temporaryFilePath
}

Get-Job | Wait-Job | Receive-Job
Get-Job | Remove-Job

Надеюсь, это поможет.

person BYC    schedule 20.10.2017