Подождите, пока PsExec вызовет cmd /c для завершения в PowerShell

У меня есть динамически сгенерированный командный файл, который я отправляю на удаленный компьютер, а затем выполняю его с помощью PsExec. Проблема, с которой я сталкиваюсь, заключается в том, что как только эта строка вызывается, сценарий PowerShell запускается и не ожидает его завершения. Вот что у меня есть:

psexec -accepteula \\$Server -u Username -p Password-d -i 2 cmd /c C:\Call.bat

Call.bat вызывает исполняемый файл на удаленной машине с несколькими переданными параметрами. Этот файл генерируется динамически и каждый раз отличается, но может выглядеть так:

cd C:\20161212-175524
C:\20161212-175524\RE.exe /pa1 /pa2 /pa3 /pa4 /pa5 /pa6 /pa7 /pa8 /pa9 /pa10

Пакетный файл должен запускаться как интерактивный сценарий от имени этого конкретного пользователя, но мне нужно, чтобы он хотя бы дождался завершения вызываемого процесса. Я пробовал добавлять 2>&1 а также | Out-Null

В идеале я хотел бы получить код завершения, возвращаемый порожденным процессом, но это может быть слишком много.

2 ответа

Решение

Ранее я использовал что-то вроде этого, чтобы добиться ожидаемого вами ожидания:

Start-Process -FilePath 'c:\tools\PSexec.exe' -ArgumentList "-u MyUserName -p $password \\$Computer .\Run.bat $Var >> C:\Temp\$Computer.log" -Wait -Passthru -WindowStyle Hidden

Вам нужно сосредоточиться на приведенной выше строке, используя Start-Process Командлет мы можем использовать
-Wait параметр.

Надеюсь, что это ответ на ваш вопрос

private static string ExecuteAndGetOutput(string command)
{
    string resultFile = Path.GetTempFileName();
    string commandFile = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(resultFile) + ".bat");

    command += @" >""{0}""";
    command = string.Format(command, resultFile);
    File.WriteAllText(commandFile, command);

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = commandFile;
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    Process p = Process.Start(psi);
    p.WaitForExit();

    int exitCode = p.ExitCode;
    return File.ReadAllText(resultFile);            
}
Другие вопросы по тегам