【发布时间】: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 = <ScriptContent>;->processStartInfo.Arguments = "-Command \""+Regex.Replace(<ScriptContent>,@"""|\\(?=\\*"")",@"\$&")+"\"";? -
我只是想转义任何被 PowerShell 命令行解析器视为特殊字符的字符。
标签: powershell process