Windows 10 で Powershell の起動が遅い

Windows 10 で Powershell の起動が遅い

Windows 10 (バージョン 1703 - Creators Update) で PowerShell プロンプトの起動が遅いという問題があります。

私のハードウェア仕様 (かなり高速なマシン): Intel i5-7440HQ (クアッドコア) / 32GB DDR4 RAM / 512 Samsung SSD ハードドライブ。

プロファイルと実行ポリシーをバイパスしようとしましたが、何も変わりませんでした。

powershell -noprofile -ExecutionPolicy バイパス ( 測定コマンド { powershell "Write-Host 1" } ).TotalSeconds

6,228067

私の友人の同じラップトップ(Creators Update なしの Windows 10 搭載)では、PowerShell が 0.5 秒未満で実行されます。

また、ngen.exe を使用してコンパイルを試みましたが、役に立ちませんでした。

$env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  if (! $_.location) {continue}
  $Name = Split-Path $_.location -leaf
  Write-Host -ForegroundColor Yellow "NGENing : $Name"
  ngen install $_.location | % {"`t$_"}
}

この問題をどのように調査すればよいか、何かアイデアはありますか?

ご挨拶

答え1

これは私にも起こりました。おそらく最善の方法ではないかもしれませんがpowershell.exeWindows Defender の除外20 秒から 1 秒未満に高速化しました。

レガシー コンソールの使用、PSReadLine の削除、ngen の実行はまったく役に立たないようです。

答え2

PowerShell が起動時に次のエラーで失敗し始めるまで、私はかなり長い間同じ問題を経験していました。

Exception:
System.OutOfMemoryException: Array dimensions exceeded supported range.
   at System.Collections.Generic.List`1.set_Capacity(Int32 value)
   at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
   at System.Collections.Generic.List`1.Add(T item)
   at System.IO.File.InternalReadAllLines(String path, Encoding encoding)
   at Microsoft.PowerShell.PSConsoleReadLine.<ReadHistoryFile>b__67_0()
   at Microsoft.PowerShell.PSConsoleReadLine.WithHistoryFileMutexDo(Int32 timeout, Action action)
   at Microsoft.PowerShell.PSConsoleReadLine.DelayedOneTimeInitialize()
   at Microsoft.PowerShell.PSConsoleReadLine.Initialize(Runspace runspace, EngineIntrinsics engineIntrinsics)
   at Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------

これにより、既存の Github の問題にたどり着きました。https://github.com/Powershell/PSReadLine/issues/673

~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\当時 6 GB を超えていた履歴ファイルを削除してみたところ、PowerShell コンソールがかなり速く開くようになりました。

おそらく、発生している速度低下は、PowerShell が大きな履歴ファイル (まだ原因になるほど大きくはありませんOutOfMemory) を読み取ろうとしていることが原因です。

答え3

Powershellの起動が遅くなる原因は他にもあるかもしれませんが、いつも私の場合、速度低下の原因は Windows の更新です。

PowerShell がロードしたすべてのアセンブリを実行する代わりに、グローバルにインストールされたすべてのアセンブリを最適化するngen実行を行いたいのです。ngen update

. (Join-Path ([Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) ngen.exe) update

2019年5月にWin10にアップデートした後、パフォーマンスが向上したことがわかりました。

(measure-command { powershell.exe -command "1+1" }).TotalSeconds

約 1.35 秒から約 0.55 秒になりました。

答え4

procmon (sysinternals ツール) を使用して powershell.exe を分析したところ、プロセスが catroot2 フォルダーで何かを実行しようとしていることがわかりました。そのため、名前を変更した後 (フォルダーをブロックする CryptSvc サービスを停止する必要があります)、フォルダーが自動的に作成されました。結論としては、フォルダーが破損したということです。(英語が下手で申し訳ありません)

次の.batを実行する

net stop CryptSvc /y
rename c:\windows\system32\catroot2 Catroot2.bak
net start CryptSvc

関連情報