わすれなぐさ

自称情報ブログ・備忘録

間違いの指摘や役に立ちそうな情報など、些細な事でも気軽にコメントしてください。ブログ管理人へ直接連絡したいときは右下のフォームをご利用ください。

自爆するバッチファイルの作り方です。自分自身のパスの書き方についても解説しています。

コマンド

自分を消すコマンドは次の通りです。
del "%~f0"

場合によっては次のほうが簡単に書けます。
del %0

この2つの違いは次で説明します。

自分自身を表す変数について

自分自身を表す変数(?)は次のようになっています。

変数 説明
%0 バッチファイル実行時に指定された形† "C:\foo\bar\test.bat" など
%~0 バッチファイル実行時に指定された形†(引用符なし) C:\foo\bar\test.bat など
%~f0 フルパス C:\foo\bar\test.bat
%~d0 ドライブ C:
%~p0 パス \foo\bar\
%~n0 ファイル名 test
%~x0 拡張子 .bat

†:ダブルクリックで実行したときは、ダブルクオーテーション付きのフルパスになります。別のバッチファイルやコマンドラインから実行した場合は、実行時に指定した形になります。

文字を組み合わせて使うこともできます。例えば、%~nx0 で拡張子付きのファイル名を表せます。%~dpnx0 で %~f0 と同じ意味になります。

この変数の使い方は call 文のヘルプで説明されています。以下、call /? の実行結果から一部引用。
また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように
変更されました:


    %* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
        %5 など) を参照します。

    バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
    を使うことができます:

        %~1         - すべての引用句 (") を削除して、%1 を展開します。
        %~f1        - %1 を完全修飾パス名に展開します。
        %~d1        - %1 をドライブ文字だけに展開します。
        %~p1        - %1 をパスだけに展開します。
        %~n1        - %1 をファイル名だけに展開します。
        %~x1        - %1 をファイル拡張子だけに展開します。
        %~s1        - 展開されたパスは、短い名前だけを含みます。
        %~a1        - %1 をファイル属性に展開します。
        %~t1        - %1 をファイルの日付/時刻に展開します。
        %~z1        - %1 をファイルのサイズに展開します。
        %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                       最初に見つかった完全修飾名に %1 を展開します。
                       環境変数名が定義されていない場合、または
                       検索してもファイルが見つからなかった場合は、
                       この修飾子を指定すると空の文字列に展開されます。

    修飾子を組み合わせて、複合結果を得ることもできます:

        %~dp1       - %1 をドライブ文字とパスだけに展開します。
        %~nx1       - %1 をファイル名と拡張子だけに展開します。
        %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                       検索して %1 を探し、最初に見つかったファイル
                       のドライブ文字とパスだけに展開します。
        %~ftza1     - %1 を DIR の出力行のように展開します。

    上の例の %1 と PATH は、他の有効な値で置き換えることができ
    ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
    は %* と同時には使用できません。


参考



一言

「バッチファイル 自分 削除」と検索すると、コマンド自体は見つけられるのだが、肝腎の説明が載っていないので困っていた。しかし「バッチファイル 自分自身」と検索すれば、ちゃんと変数の意味が説明されているウェブページを発見することができた。こういうのが「ググる力」なのだなと再実感した。

前回で、Windows 10インストールの自動化はできました。
最後に、Windows 10のインストール後に自動でアプリケーションをインストールするようにしてみましょう。ただし、あまりスマートなやり方ではないです。方法をざっくり説明すると、応答ファイルにコマンドを記入して、ログオン時にインストーラーを実行するようにして、アプリケーションをインストールします。

7. 最初のログオン時に実行するコマンドを応答ファイルに記入する

① Windows SIMでAutounattend.xmlを開きます。

② コンポーネント「Shell-Setup\FirstLogonCommands」を「パス 7 oobeSystem」に追加します。

② 「FirstLogonCommands」を右クリックして「新しい SynchronousCommand の挿入」を選択します。

③ 追加した「SynchronousCommand」を選択して、設定の「CommandLine」にコマンドを記入することで、最初のログオン時にコマンドを実行することができます。

④ 「Order」には「1」と記入します。

インストールメディアにバッチファイルを置いて応答ファイルで実行する

実行したいコマンドラインがたくさんある場合はバッチファイルにまとめてしまいましょう。

インストールメディア(USBメモリ)内にバッチファイルを置き、「CommandLine」にそのバッチファイルのパスを書いておけば、最初のログオン時にバッチファイルを実行することができます。

もしWindows 10をインストールするPCにCドライブしかないのであれば、USBメモリはDドライブになりますから、「CommandLine」に例えば「D:\Setup.bat」と書いておけばUSBメモリのルートに置いたSetup.batを実行できます。

コンポーネント 設定
Shell-Setup\FirstLogonCommands\SynchronousCommand CommandLine D:\Setup.bat
Order 1

アプリケーションを自動でインストールする

インストールメディア(USBメモリ)内にアプリケーションのインストーラーを置いておき、それをコマンドでCドライブにコピーして、msiexecコマンドなどでインストールを実行すれば、Windows 10のインストール後に自動でアプリケーションをインストールすることができます。

前回の記事では、Windows SIMを使ってWindows 10インストールの前半を自動化する応答ファイルを作成しました。
この記事では、インストールの後半であるOOBE(Out-Of-Box Experience)を自動化する設定を応答ファイルに加えていきます。Windows WIMの使い勝手は前回、画像付きで説明したので、今回の記事は画像を省いています。

6. OOBEの応答ファイルを作成する

① 前回作ったAutounattend.xmlをWindows SIMで開きます。

② 以下のコンポーネントを「パス 7 oobeSystem」に追加します。
  • International-Core (WinPEは付かない)
  • Shell-Setup

③ コンポーネントの設定をします。
コンポーネント 設定
International-Core InputLocale 0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}
SystemLocale ja-JP
UILanguage ja-JP
UILanguageFallback ja-JP
UserLocale ja-JP
Shell-Setup TimeZone Tokyo Standard Time
Shell-Setup\OOBE HideEULAPage true
HideOEMRegistrationScreen true
HideOnlineAccountScreens true
HideWirelessSetupInOOBE true
ProtectYourPC 1
※「TimeZone」は何も書かなくても問題ありませんでした。ただし空白を書き込むと失敗します。
※「NetworkLocation」「SkipMachineOOBE」「SkipUserOOBE」はWindows 10では使わなくなりました。
※「HideLocalAccountScreen」はWindows Server向けの設定です。


④ 「Shell-Setup\UserAccounts\LocalAccounts」を右クリックして「新しい LocalAccount の挿入」を選択します。

⑤ 追加した「LocalAccount」の設定をします。
コンポーネント 設定
Shell-Setup\UserAccounts\LocalAccounts\LocalAccount Description (説明)
DisplayName (表示名)
Group Administrators
Name (ユーザー名)
Shell-Setup\UserAccounts\LocalAccounts\LocalAccount\Password Value (パスワード)
  • 「Description」は書かなくても問題ないと思います。
  • 「Name」はユーザーフォルダの名前になります。
  • パスワードを設定しない場合は、「Value」に空の文字列を書き込んでおきます。

⑥ 応答ファイルをAutounattend.xmlの名前で保存する。

応答ファイルの使い方

作成したAutounattend.xmlをインストールメディア(USBメモリ)のルートに設置します。そのメディアからブートすることで、Windows 10を自動インストールできます。

参考

設定値について詳しくは次のリファレンスをご覧ください。
参考:

次の記事

次は、Windows 10のインストール後に自動でアプリケーションがインストールされるようにしてみましょう。

付録

完成した応答ファイルの内容を載せておきます。
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SetupUILanguage>
                <UILanguage>ja-JP</UILanguage>
            </SetupUILanguage>
            <InputLocale>0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}</InputLocale>
            <SystemLocale>ja-JP</SystemLocale>
            <UILanguage>ja-JP</UILanguage>
            <UILanguageFallback>ja-JP</UILanguageFallback>
            <UserLocale>ja-JP</UserLocale>
        </component>
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <DiskConfiguration>
                <Disk wcm:action="add">
                    <CreatePartitions>
                        <CreatePartition wcm:action="add">
                            <Order>1</Order>
                            <Size>499</Size>
                            <Type>Primary</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>4</Order>
                            <Extend>true</Extend>
                            <Type>Primary</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>3</Order>
                            <Size>16</Size>
                            <Type>MSR</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>2</Order>
                            <Size>100</Size>
                            <Type>EFI</Type>
                        </CreatePartition>
                    </CreatePartitions>
                    <ModifyPartitions>
                        <ModifyPartition wcm:action="add">
                            <Format>NTFS</Format>
                            <Label>Windows RE</Label>
                            <Order>1</Order>
                            <PartitionID>1</PartitionID>
                            <TypeID>DE94BBA4-06D1-4D40-A16A-BFD50179D6AC</TypeID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Format>NTFS</Format>
                            <Label>Local Disk</Label>
                            <Letter>C</Letter>
                            <Order>4</Order>
                            <PartitionID>4</PartitionID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <PartitionID>3</PartitionID>
                            <Order>3</Order>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Format>FAT32</Format>
                            <Label>System</Label>
                            <Order>2</Order>
                            <PartitionID>2</PartitionID>
                        </ModifyPartition>
                    </ModifyPartitions>
                    <DiskID>0</DiskID>
                    <WillWipeDisk>true</WillWipeDisk>
                </Disk>
            </DiskConfiguration>
            <ImageInstall>
                <OSImage>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>4</PartitionID>
                    </InstallTo>
                </OSImage>
            </ImageInstall>
            <UserData>
                <ProductKey>
                    <Key />
                </ProductKey>
                <AcceptEula>true</AcceptEula>
            </UserData>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <ProtectYourPC>1</ProtectYourPC>
            </OOBE>
            <UserAccounts>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>UABhAHMAcwB3AG8AcgBkAA==</Value>
                            <PlainText>false</PlainText>
                        </Password>
                        <DisplayName>User</DisplayName>
                        <Name>User</Name>
                        <Group>Administrators</Group>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>
            <TimeZone>Tokyo Standard Time</TimeZone>
        </component>
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>0411:{03B5835F-F03C-411B-9CE2-AA23E1171E36}{A76C93D9-5523-4E90-AAFA-4DB112F9AC76}</InputLocale>
            <SystemLocale>ja-JP</SystemLocale>
            <UILanguage>ja-JP</UILanguage>
            <UILanguageFallback>ja-JP</UILanguageFallback>
            <UserLocale>ja-JP</UserLocale>
        </component>
    </settings>
    <cpi:offlineImage cpi:source="wim:c:/temp/install.wim#Windows 10 Pro" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>

このページのトップヘ