【问题标题】:Issue while executing powershell script through System.Diagnostics.Process or System.Management.Automation.Runspaces通过 System.Diagnostics.Process 或 System.Management.Automation.Runspaces 执行 powershell 脚本时出现问题
【发布时间】:2016-02-07 13:26:14
【问题描述】:

在解决以下问题时需要您的帮助。

我们有一个类似的 powershell 脚本:

invoke-command -ScriptBlock { [cmdletbinding()]
param(
    [parameter(mandatory=$True)]
    [string] $ticktfilepath      
)
$ticketdetails=get-content $ticktfilepath |%{if ( $_ -like '"AB*' ) {$_}}|%{echo "$($_.Split(',')[7].Split('"')[1])=$($_.Split(',')[3].Split(':')[0].Split(' ')[$_.Split(',')[3].Split(':')[0].Split(' ').length-1])=$($_.Split(',')[0].Split('"')[1]);"}
write-output $ticketdetails } -ArgumentList 'D:\file.csv' 

此脚本读取一个 csv 文件,并对 csv 中以“AB...”开头的那些行进行一些字符串解析。传递的 csv 文件包含带有“AB...”的行,因此返回结果。这在通过 powershell 控制台或 ISE 执行时完美运行。

但根据我们的要求,我们尝试通过以下方式执行相同的脚本: 1. System.Diagnostics.Process,进程启动信息的文件名为 powershell.exe 和上述脚本中的参数。它失败了-like。即在 |%{if ( $_ -like '"AB*' )。即使预期为真,该条件始终为假。 注:其他 powershell 脚本与这种方法完美配合 2. 通过 System.Management.Automation.Runspaces 执行时完全相同的问题 所以看起来像是使用“–like”运算符的一些约束。 我们甚至使用 System.Diagnostics.Process 方法尝试利用 Process.StandardInput.WriteLine(line) 逐行编写脚本,但随后 powershell 挂起。

任何解决此问题的指针都将受到高度赞赏。

在使用 System.Diagnostics.Process 时,我使用了类似的东西:

                ProcessStartInfo processStartInfo = new ProcessStartInfo();
                processStartInfo.UseShellExecute = false;
                processStartInfo.RedirectStandardError = true;
                processStartInfo.RedirectStandardOutput = true;
                processStartInfo.FileName = "powershell.exe";
                processStartInfo.Arguments = <ScriptContent>;
                Process powerShellProc = new Process();
                powerShellProc.StartInfo = processStartInfo;
                powerShellProc.Start();

                string successMessage = powerShellProc.StandardOutput.ReadToEndAsync().Result;
                string errorMessage = powerShellProc.StandardError.ReadToEndAsync().Result;
                powerShellProc.WaitForExit();

在哪里, ScriptContent-就是上面的powershell脚本。

而不是喜欢,甚至尝试使用startswith,但结果也相同。但是使用 powershell 控制台或 iSE,它可以完美运行。

【问题讨论】:

  • 顺便说一句,Invoke-Command 不使用 cmdlet 绑定,所以在这里没用。
  • 一个补充:在使用进程或运行空间(如下所述)时,我们正在利用脚本块来传递脚本。由于我们有不能使用物理文件的限制。
  • 你能显示你试过的确切命令吗?我自己尝试了一下,-like 可以正常工作。
  • 这个怎么样:processStartInfo.Arguments = &lt;ScriptContent&gt;; -> processStartInfo.Arguments = "-Command \""+Regex.Replace(&lt;ScriptContent&gt;,@"""|\\(?=\\*"")",@"\$&amp;")+"\"";?
  • 我只是想转义任何被 PowerShell 命令行解析器视为特殊字符的字符。

标签: powershell process


【解决方案1】:

现在回答可能为时已晚:)

您不应在进程实际完成之前调用 powerShellProc.StandardOutput.ReadToEndAsync().Result。你可以使用来自How to capture process output asynchronously in powershell?的Invoke-Executable函数

以下命令有效

   $outTask = $oProcess.StandardOutput.ReadToEndAsync();
    $errTask = $oProcess.StandardError.ReadToEndAsync();
    $bRet=$oProcess.WaitForExit($TimeoutMilliseconds)
    $outText = $outTask.Result;
    $errText = $errTask.Result;

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多