我在PowerShell中有一个调用LogParser的脚本。在脚本的早期,我定义了可执行文件的路径并测试了它的路径:
#Define path to log parser executable
$logParser = '\\hostname\logparser22\LogParser.exe'
if (! $(Test-Path $logParser) )
{
Write-Host -ForegroundColor Red "Could not access: $logParser"
return
}
然后在脚本中我调用LogParser:
$sessionData = & $logParser "SELECT * FROM $logPath where data LIKE `'Contoso\\$user`'" -i:csv -nSkipLines:4 -headers:on -stats:off -o:csv
这在PowerShell会话期间工作了一段时间,但如果运行足够多次,它最终会停止工作。在我输入破损的shell后进行一些调试,下面甚至没有产生在没有参数的情况下调用LogParser时返回的正常帮助:
& $LogParser
但是,如果我打开运行SAME exact命令的新PowerShell会话,它会工作并调用LogParser,并且在不传递任何参数时我会从中获得标准响应。
我所得到的是&以某种方式被打破。有没有人看过这个并知道修复工作?
答案 0 :(得分:1)
也许您可以尝试使用其他方式使用Cmdlet启动外部进程:
$logParser = '\\hostname\logparser22\LogParser.exe'
$allArgs = ("SELECT * FROM $logPath where data LIKE `'Contoso\\$user`'", "-i:csv", "-nSkipLines:4", "-headers:on", "-stats:off -o:csv")
$ps = Start-Process -FilePath $logParser -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
$ps.WaitForExit() # block till exe finish
$ps.ExitCode;
您应该对错误有更多解释。
答案 1 :(得分:1)
我遇到了这个问题。正如bug report中所提到的,Powershell V2中的解决方法是将[GC]::Collect()
放入写入控制台的循环中。
&<command>
是呼叫外部.exe
的首选方式。有一篇关于how to set up your external calls with arguments的优秀文章。
答案 2 :(得分:0)
这可能与PowerShell处理大量控制台输出的this defect有关,这可能很容易发生在LogParser上。这可以在PowerShell 3.0中修复。