Подождите, пока 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);
}