Windowsイメージから情報を取得するスクリプト

DISMシステムコマンドを使用してWindowsイメージを処理するトピックに関する一連の記事があります。 私の記事では、 cmd.exeコマンドラインインタープリター言語のスクリプトの例を提供しました。 作業の結果、元のWindowsイメージ(ライブシステムまたはスタンドアロン* .wimファイル)が変更されました-更新プログラムが統合され、システムコンポーネントが無効になり、ユニバーサルアプリケーションが削除されました。 しかし、画像に加えられた変更をどのように見るのでしょうか? この記事では、DISMコマンドを使用して、Windowsイメージからさまざまな情報を抽出し、画面上のユーザーに表示したり、ファイルにエクスポートしたりするスクリプトを紹介します。



このスクリプトは、システム管理者が独自の「アセンブリ」を作成するか、他のシステムをテストするのに役立ちます。 インストールされたOSに関する情報を確認する必要がある場合があります。この場合、このスクリプトも役立ちます。 Windowsイメージから情報を取得するためのすべてのDISMコマンドは、このスクリプトに実装されています。 このスクリプトを使用して取得できる画像からの情報:





括弧は、情報の側面を示します。 特定のタイプのオブジェクトを画像に追加または削除できる場合、情報には画像内のこのタイプのオブジェクトの存在が表示されます。 イメージ内でオペレーティングシステムの一部のプロパティを切り替えることができる場合(許可/禁止など)、情報にはこのプロパティの状態が表示されます。 リストの最後の2つの項目は、Windows 8以降のOSでのみ使用できます。このスクリプトにGetWimInfo.cmdという名前を付けました。これは次のとおりです。



スクリプト



@echo off title Getting information from Windows image set _file=install.wim set _img=Online set _mnt=mount set _tool=7 set _word=Wim ver | find "6.1" > nul || set _tool=8 if %_tool% GTR 7 set _word=Image :pre_menu cls if not exist %_file% goto :adv_menu dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file% echo ------------------------------------------------------------------------------- if %ERRORLEVEL% NEQ 0 pause & exit set /p _ind=Input index or press [Enter] for quit: || exit if %_ind% EQU 0 goto :adv_menu if %_ind% GTR 0 if %_ind% LEQ 24 goto :ind_menu goto :pre_menu :ind_menu cls dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file% /Index:%_ind% echo ------------------------------------------------------------------------------- if %ERRORLEVEL% NEQ 0 pause & goto :pre_menu choice /c abcdefghijklmnopqrstuvwxyz /n /m "Mount selected image? [m] " if %ERRORLEVEL% EQU 13 goto :mount goto :pre_menu :adv_menu cls if %_img%==Online (echo DISM: Online Servicing)^ else (dism /English /LogLevel:1 /Get-Mounted%_word%Info) echo ------------------------------------------------------------------------------- echo ~~~~Menu~~~~ echo [d] drivers ([D] - export) echo [p] packages ([P] - export) echo [f] features ([F] - export) echo [l] languages echo [e] editions echo [a] app if %_tool% GTR 7 echo [x] appx ([X] - export) if %_tool% GTR 7 echo [s] assoc ([S] - export) echo [q] quit (unmount) echo ------------------------------------------------------------------------------- choice /c dDpPfFleaxXsSq /n /cs /m "Your choice: " if %ERRORLEVEL% EQU 1 goto :drivers if %ERRORLEVEL% EQU 2 goto :drivers-export if %ERRORLEVEL% EQU 3 goto :packages if %ERRORLEVEL% EQU 4 goto :packages-export if %ERRORLEVEL% EQU 5 goto :features if %ERRORLEVEL% EQU 6 goto :features-export if %ERRORLEVEL% EQU 7 goto :languages if %ERRORLEVEL% EQU 8 goto :editions if %ERRORLEVEL% EQU 9 goto :app if %ERRORLEVEL% EQU 10 if %_tool% GTR 7 (goto :appx) else (goto :adv_menu) if %ERRORLEVEL% EQU 11 if %_tool% GTR 7 (goto :appx-export) else (goto :adv_menu) if %ERRORLEVEL% EQU 12 if %_tool% GTR 7 (goto :assoc) else (goto :adv_menu) if %ERRORLEVEL% EQU 13 if %_tool% GTR 7 (goto :assoc-export) else (goto :adv_menu) goto :unmount :drivers cls dism /%_img% /English /LogLevel:1 /Get-Drivers /All | more echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :drivers-export cls if exist drivers%_numd%.txt set /a _numd+=1 & goto :drivers-export echo Getting list of drivers. Please wait... dism /%_img% /English /LogLevel:1 /Get-Drivers /All /Format:Table > drivers%_numd%.txt goto :adv_menu :packages cls dism /%_img% /English /LogLevel:1 /Get-Packages | more echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :packages-export cls if exist packages%_nump%.txt set /a _nump+=1 & goto :packages-export echo Getting list of packages. Please wait... dism /%_img% /English /LogLevel:1 /Get-Packages /Format:Table > packages%_nump%.txt goto :adv_menu :features cls dism /%_img% /English /LogLevel:1 /Get-Features | more echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :features-export cls if exist features%_numf%.txt set /a _numf+=1 & goto :features-export echo Getting list of features. Please wait... dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > features%_numf%.txt goto :adv_menu :languages cls dism /%_img% /English /LogLevel:1 /Get-Intl echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :editions cls dism /%_img% /English /LogLevel:1 /Get-CurrentEdition echo ------------------------------------------------------------------------------- dism /%_img% /English /LogLevel:1 /Get-TargetEditions echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :app cls if %_img%==Online goto :adv_menu dism /%_img% /English /LogLevel:1 /Get-Apps echo ------------------------------------------------------------------------------- dism /%_img% /English /LogLevel:1 /Get-AppPatches echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :appx cls dism /%_img% /English /LogLevel:1 /Get-ProvisionedAppxPackages | more echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :appx-export cls if exist appxes%_numx%.txt set /a _numx+=1 & goto :appx-export echo Getting list of appx. Please wait... dism /%_img% /English /LogLevel:1 /Get-ProvisionedAppxPackages > appxes%_numx%.txt goto :adv_menu :assoc cls dism /%_img% /English /LogLevel:1 /Get-DefaultAppAssociations | more echo ------------------------------------------------------------------------------- choice /cb /n /m "Back [b] " goto :adv_menu :assoc-export cls if exist associat%_nums%.txt set /a _nums+=1 & goto :assoc-export echo Getting list of assoc. Please wait... dism /%_img% /English /LogLevel:1 /Get-DefaultAppAssociations > associat%_nums%.txt goto :adv_menu :mount cls md %_mnt% dism /English /LogLevel:1 /Mount-%_word% /%_word%File:%_file% /Index:%_ind% /MountDir:%_mnt% /ReadOnly if %ERRORLEVEL% NEQ 0 rd %_mnt% & pause & exit set _img=Image:%_mnt% goto :adv_menu :unmount cls if not exist %_file% exit if not %_img%==Online ( dism /English /LogLevel:1 /Unmount-%_word% /MountDir:%_mnt% /Discard rd %_mnt% ) set _img=Online goto :pre_menu
      
      





使用する



Windowsオペレーティングシステムのスタンドアロンイメージがスクリプト起動フォルダー( install.wimファイル)にある場合、使用可能なインデックスに関する情報がそこから要求され、ユーザーは作業する番号を入力するように求められます。 選択したインデックスに関する次のサブメニューに詳細情報が表示され、ユーザーはこのイメージをマウントして作業を続行するように求められます。 イメージをマウントすると、メインスクリプトメニューが画面に表示されます。 install.wimファイルがスクリプト起動フォルダーにない場合、すぐにメインメニューに移動し、情報要求が現在のOSに送信されます。 メインメニューの操作は非常に簡単です。適切なキーを押すだけで画面に情報が表示されます。 一部のアイテムでは、データ量が多くなる可能性があるため、スクリプト起動フォルダーに作成されたテキストファイルに情報をエクスポートするためのアイテムが追加されています。 ファイルへのエクスポートは大文字です。



コード解析



最初に、setコマンドは変数を設定します。 install.wimイメージファイルの推定名を変更できます(たとえば、install.esdに)。 マウントフォルダーの名前(既定ではマウント)を変更するか、マウントフォルダーをスタートアップフォルダーの外に置く必要がある場合はパスを指定できます。
また、スクリプトが実行されているOSのバージョンが最初に論理的に決定されます。Windows7でない場合は、それより新しいバージョンです。 これに基づいて、DISMシステムのどのバージョンがスクリプトコマンドを受信するかについて結論付けられます。これは、最後の2つのメニュー項目の可用性に影響します。



:pre_menu



アドバンスメニュー。 エラー制御を使用したwimファイルに関する基本情報の取得。 画像ファイルがない場合は、オンラインモードで起動します。


:ind_menu



インデックスメニュー。 エラー制御付きのwimファイルで選択された「インデックス」に関する拡張情報を取得します。 「インデックス」をマウントする提案。


:adv_menu



スクリプトのメイン(拡張)メニュー。 選択した項目に対応するキーを押すと、スクリプトの本文にある対応するラベルへの遷移が発生し、その後に必要なコマンドが実行されてこのメニューに戻ります。 画面に情報を表示するためのすべての項目は同じタイプであり、いくつかのDISMコマンドが含まれています。 それらを分解する必要はありません。 画面に情報を表示するよりも、テキストファイルにエクスポートする方が重要です。 情報は表形式で記録されるため、認識や比較に便利です。 情報の種類ごとに、特定の名前のテキストファイル。 ある時点でエクスポートを繰り返してもファイルは置き換えられませんが、新しいインデックスが作成され、名前に数値インデックスが追加されます。 これは、たとえば、いくつかの異なる画像インデックスから情報を収集する場合に便利です。



:マウント



イメージをマウントします。 マウントフォルダは事前に作成されています。 エラー制御。 イメージの仕様を定義する変数が変更され、オフラインイメージへのパスを指すようになりました。
また、マウントは/ ReadOnlyモードで行われることにも注意してください。つまり、イメージファイルの日付や属性など、イメージに変更を加える方法はありません。



:マウント解除



イメージをアンマウントします。 オンライン保守(/オンライン)を実行した場合、マウントを解除する必要はありません。 変数を元の値に戻す。


マウントは読み取り専用であったため、 / Discardスイッチでアンマウントします。 キーの欠如は受け入れられません。



おわりに



このスクリプトは、以前の記事で私が提示したスクリプトのコレクションへの論理的な追加です。 実際には、これらはすべて3か月以上前に書かれたものであり、これが私の最初のスクリプトでした。 徐々に徐々にカードを公開します。 もちろん、多くのシステム管理者は長い間、このようなソリューションを自分で書いており、それぞれが独自のソリューションを持っています。 他の人の開発は私にとって不快であるように思われ、場合によっては面倒でした。 誰かがDISMシステムのすべての機能を1つの「メガ」スクリプトで実現しようとしましたが、特定のタスク用に複数のスクリプトを作成することにしました。 アイデアを実装したりエラーを修正したりするときに、すべてのファイルを一度に編集しなければならなかったため、いくつかのコードを繰り返すことはおそらくあまり良くありません。 PowerShellの広告主は通り過ぎます。 私はこのスクリプトを自分用に作成し、そのまま共有することにしました。 仕事と研究の例の両方で、多くの人がそれを役に立つと思います。



All Articles