
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.exe
、Windows 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