【问题标题】:Wait for PsExec calling cmd /c to finish in PowerShell等待 PsExec 调用 cmd /c 在 PowerShell 中完成
【发布时间】:2016-12-12 23:33:31
【问题描述】:

我有一个动态生成的批处理文件,我将它推送到远程 PC,然后使用 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

理想情况下,我想检索衍生进程返回的退出代码,但这可能太多了。

【问题讨论】:

标签: powershell return-value psexec


【解决方案1】:

以前我用过这样的东西来实现你所追求的:

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 cmdlet 我们可以使用
-Wait 参数。

希望这能回答你的问题

【讨论】:

    【解决方案2】:
    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);            
    }
    

    【讨论】:

    • 语言错误...?^^
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多