tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell をDOSコマンド画面で実行していると $LASTEXITCODE = -1073741502 で PowerShell.exe が停止する問題

このページを検索で見つけた人はさぞかし困っているかと思います。 この問題は、 PowerShell 2.0の頃から騒がれ、PowerShell 3.0 でも依然として残っています。 その概要と対応を見てみましょう。

どのような時に起こるのか

結論から言います。
cmd から powershell -command "hogehoge" や powershell -file .\hogehoge.ps1 とした時に、ホスト画面出力が多大な寮になった時
特に cmd から PowerShell Script を呼び出して いると起きます。 はい、Shell なのに! まさに OOが! って言いたくなる状況です。 (というか言いました) スケジューラタスクなどからの呼び出しなど .bat が便利なシーンはあるので、困りますね。

対策

唯一の方法は、 ホスト画面を可能な限り減らすことです。
つまり、 Write-Output や Write-Host、 Write-Warning、Write-Error などの表示を過度に出さないことが必要です。 経過などは、 Write-Process を使うことで軽減できるのでおすすめです。 また、長いスクリプトを書いていて調整するなら、前回の記事のような、便利コマンドレットを自作しておくのもおすすめです。 Tee-Objectは使い物にならないので厳禁です。

メモリ問題じゃないの?

この問題は、 memory や GC は関係ないのです。
そのため、PowerShell でメモリ制限を調整するで紹介した方法で WinRM のメモリを足してもダメです。 Task manager でも 実際 PowerShell.exeは100MB 程度で出たりします。 (出力少なければ 1GB も平気なのに!) 当然cmd は 700kb程度とかです。

日本語OSだと起きやすい

日本語嫌いです。 英語OSでは、同じ出力量でもおきないのですから、描画速度の問題といい 日本語嫌ですね。

海外のフォーラム

日本でもこういうフォーラムがあればいいのに! ないなら、もはや誰か作りませんか (白目
DOS commands stop working after executing bit of code in a script Stability problem. Any application run fails with $LASTEXITCODE = -1073741502