多くのシステム管理者は、バッチファイルから特定の順序でインストールを開始することにより、サービスパックの「コレクション」を収集します。 しかし、時々、なじみのないコンピューターにサービスを提供し、どの更新プログラムがインストールされ、どの更新プログラムがインストールされていないかが正確にわからないことがあります。 長いリストからすべての更新プログラムのインストールを開始した場合、OSイメージにいくつかの更新プログラムがある場合、DISMシステムは引き続きそれらを「上に」インストールします。 スクリプトで時間を無駄にしないために、インストールされたサービスパックがOSに存在するかどうかをチェックする「関数」が使用されます。 たとえば、スクリプトコードでは、更新KB3177467 (サービススタック更新)およびKB3125574 (簡易ロールアップ更新)がインストールされます。 また、OSビット深度は自動的に決定されますが、これは質問のトピックとは関係ありません。
スクリプト:
@echo off set arch=x64 if "%PROCESSOR_ARCHITECTURE%" == "x86" if not defined PROCESSOR_ARCHITEW6432 set arch=x86 echo The most important updates after SP1 (Convenience rollup) %arch% echo ------------------------------------------------------------------------------- echo Get packages list. Please wait... dism /English /Online /Get-Packages > "%TEMP%\packages.txt" echo Servicing stack update: KB3177467 call :exist .\%arch%\Windows6.1-KB3177467-%arch%.cab ||^ dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3177467-%arch%.cab /Quiet /NoRestart echo Convenience rollup update: KB3125574 call :exist .\%arch%\Windows6.1-KB3125574-v4-%arch%.cab ||^ dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3125574-v4-%arch%.cab /Quiet /NoRestart echo ------------------------------------------------------------------------------- pause :exist dism /English /Online /Get-PackageInfo /PackagePath:%1 | find "Package Identity" |^ findstr /g:/ %TEMP%\packages.txt > nul && exit /b exit /b 1
ファイルとフォルダー:
スクリプトに示されているものはサンプルとして使用されるため、ここにはサービスパックファイルを添付しません。 スクリプトの場所に、必要なサービスパックを配置する必要があるx64およびx86フォルダーを作成する必要があります。 キリル文字を使用して情報メッセージを表示しない場合、スクリプトファイル自体をANSIエンコードで保存できます。 ロシア語のテキストを表示するには、cmd-fileをOEM 866エンコードで保存する必要があります。
職務内容:
インストールを開始する前に、DISMシステムはOSに( / Get-Packages ])にすでにインストールされている更新パッケージのリストを要求し、一時フォルダー%TEMP%\ packages.txtのテキストファイルに保存します 。 将来、各更新パッケージのインストールを開始する前に、「関数」の呼び出しが発生します。引数として転送を使用して存在します-検証のためのインストール済みパッケージへのパス。 「関数」 : 「パッケージID」行が検索される、チェック済みのパッケージサービス情報から抽出( / Get-PackageInfo )が存在します。 この行は、保存されたファイル%TEMP%\ packages.txtで指定された行を検索する次の検索コマンドに「パイプライン化」されます 。 検索結果によると、2つのオプションが可能です。
- インストールされたシステムによって更新が検出されない場合、「関数」 :が存在し、コード%ERRORLEVEL% 1で終了します。この場合、( / Add-Package )パッケージはDISMシステムによってインストールされます。 更新プログラムのインストール後(成功した場合)- %ERRORLEVEL%はリセットされ、次の「関数」の起動に使用できます。
- 更新がシステムにインストールされていることが検出されると、「関数」 :が存在し、コード%ERRORLEVEL% 0で終了します。この場合、更新パッケージのインストールは行われず、スクリプトはリストの次のアイテムの処理に進みます。 %ERRORLEVEL%をリセットする必要はありません。
考えられる問題:
OSに存在するアップデートの確認は、[ パッケージID]フィールドによってのみ実行され、ステータスは確認されません! 通常の状態では、パッケージのステータスはインストール済みですが、システムに存在するサービスパックの誤った状態である可能性があります:置き換えられていない (置き換えられていない )、存在しない ( 存在しない )、 ステージングされた (中間)。 スクリプト中に作成されたファイル%TEMP%\ packages.txtを開くと、存在するパッケージのステータスを表示できます。 「誤った」状態がない場合は、問題はないはずです。インストールされていないものが確立され、すでにインストールされているものはスキップされます。
このスクリプトを使用して、不足しているパッケージでOSを更新すると、時間を大幅に節約できます!