バッチファイルでリスト参照型のネットワーク設定システムを作った話

ブログ ミセス・リビング

どうも。社内のネットワーク園児ニアこと優弥です。
今日はPCのネットワーク設定を自動化するバッチを作りました。

バッチファイルの作り方は省略します。
気になる方はコチラの記事で作り方を紹介していますので、ご確認を。

【超初心者向け】業務自動化の第一ステップ ~バッチファイルの作成編~ | ミセス・リビング – 沖縄県読谷村

業務自動化を行う上で重要なバッチファイル。バッチファイルとは、簡単に言うとコマンドをまとめたテキストファイルの事です。本記事ではバッチファイルの作成方法と、バッチファイルの実行方法について超初心者でも分かるよう詳しく解説しています。基礎基本を学び、バッチファイルを用いた自動化を行っていきましょう。

ネットワークの基礎知識が無いと伝わらない話をするので、自信のない方はブラウザバック推奨。
あと、少しばかりプログラミング的な話もあります。

さて、一体どんなものを作ったのかと言いますと、あらかじめCSVファイルに記述したリストを参照して、ネットワーク設定などを行うものです。

設定内容としてはこんな感じ↓
・IPアドレス
・サブネットマスク
・デフォルトゲートウェイ
・プライマリDNS
・セカンダリDNS
・プロキシサーバー設定(例外設定も可)
・新規ユーザー作成(パスワード設定も可)
・外部のバッチファイル呼び出し

この時点で頭に?が浮かんでいる方には申し訳ないですが、今後もこんな感じです。

まず、作ろうと思ったきっかけですが、社内のネットワーク管理と初期設定を楽にする為です。
2~3台のPCであれば手作業でやってもいいかもですが、数が増えると設定が大変なんですよ、、、

ってな感じで自動化一択となりました。
別に今後は使う目途は立っていませんが、誰かしらの役に立てばと思います。

では、さっそくコードから。


    @echo off
    setlocal enabledelayedexpansion
    rem =======================================================================
    rem 題名:リスト型ネットワーク設定システム
    rem 制作:ミセス・リビング株式会社
    rem 備考:環境変数を変えてご使用下さい(リストパス・NIC名・バッチディレクトリ他)。
    rem =======================================================================
    
    
    rem ==================== 管理者として実行されているか確認 ====================
    NET FILE 1>NUL 2>NUL
    if "%ERRORLEVEL%" == "0" (
        goto title
    ) else (
        echo;
        echo ◆◆◆◆◆管理者権限ではありません。処理を中止します。◆◆◆◆◆
        ping localhost -n 4 > nul
        exit
    )
    
    
    rem ==================== タイトル表示 ====================
    :title
    cls
    echo;
    echo  -------------------------------------------------------------------
    echo ¦                      リスト型PC設定システム                     ¦
    echo ¦                                                                 ¦
    echo ¦機能:IPアドレス設定、DNS設定、ユーザー追加、PC名変更、バッチ起動¦
    echo  -------------------------------------------------------------------
    echo;
    
    
    :Main
    rem ==================== 環境変数を宣言 ====================
    set ListPathe=%~dp0\list.csv
    set NICname=イーサネット
    set AddBatPath=%~dp0data\
    
    rem ※tempファイルは実行ディレクトリで処理(ここは基本変えない)
    set List_temp=%~dp0_temp_list
    
    
    rem ==================== リストファイルがあるか確認 ====================
    if exist "%ListPathe%" (goto :seting)
        echo "%ListPathe%"が見つかりません。
        ping localhost -n 5 > nul
        exit
    end if
    
    
    rem ==================== リストファイルから値を取得 ====================
    :seting
    set /P ListNo="リスト番号を入力してください:"
    
    rem ----- 不要なtempデータを削除 -----
    if exist %List_temp% del %List_temp% > nul
    
    rem ---------- 空セル・全角「ー」を『-』に置換 ----------
    for /f "usebackq delims=" %%a in ( %ListPathe% ) do (
        set line=%%a
        set line=!line:,,=,-,!
        set line=!line:ー=,-,!
        echo !line!>>%List_temp%
    )
    
    rem ---------- 変数に抽出したトークンを検証 ----------
    set Veri=False
    for /F "USEBACKQ skip=1 delims=, tokens=1,2,3,4,5,6,7,8,9,10,11,12" %%a in ( %List_temp% ) do ( 
        if /i not "%%a" == "" (
            if "%%a" == "%ListNo%" (
                set A=%%a
                set B=%%b
                set C=%%c
                set D=%%d
                set E=%%e
                set F=%%f
                set G=%%g
                set H=%%h
                set I=%%i
                set J=%%j
                set K=%%k
                set L=%%l
                set Veri=True
            )
        )
    )
    
    rem ----- 不要なtempデータを削除 -----
    if exist %List_temp% del %List_temp% > nul
    
    rem ---------- リストからデータを取得できたか確認 ----------
    if !Veri!==True (goto Continued) else (goto EXITBAT)
    
    rem ---------- 抽出したデータの確認 ----------
    :Continued
    echo ================================================
    echo PC名            :!B!
    echo IPアドレス         :!C!
    echo サブネットマスク      :!D!
    echo デフォルトゲートウェイ    :!E!
    echo プライマリDNS        :!F!
    echo セカンダリDNS        :!G!
    echo プロキシサーバー           :!H!
    echo 例外設定          :!I!
    echo 追加ユーザー名       :!J!
    echo 追加ユーザーパスワード   :!K!
    echo 起動バッチ         :!L!
    echo;
    echo ==========上記設定で処理を行いますか?==========
    set Input=Y
    set /P Input="(Y/N)[Y]:"
    if "%Input%" == "n" (goto title)
    if "%Input%" == "N" (goto title)
    
    
    rem ==================== 処理実行 ====================
    rem ---------- IPアドレス設定 ----------
    if /i "!C!" == "-" (
        netsh interface ipv4 set address name="%NICname%" source=dhcp
        set C=DHCP
        set D=DHCP
        set E=DHCP
    ) else (
        netsh interface ipv4 set address name="%NICname%" static !C! !D! !E! 1
    )
    
    rem ---------- DNS設定 ----------
    if /i "!F!" == "-" (
        netsh interface ipv4 set dnsservers name="%NICname%" source=dhcp validate=no
        set F=DHCP
        set G=DECP
    ) else (
        netsh interface ip set dns name="%NICname%" static !F! primary validate=no
        if /i not "!G!" == "-" (netsh interface ipv4 add dns name="%NICname%" address=!G! index=2 validate=no)
    )
    
    rem ---------- プロキシサーバー追加 ----------
    if /i "!H!" == "-" (
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 0
    ) else (
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d !H!
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride /t reg_sz /d "!I!"
    )
    
    rem ---------- ユーザー追加 ----------
    if /i not "!J!" == "-" (
        net user !J! /add
        rem pass追加
        if not "!K!" == "-" (
            net user !J! !K!
        )
    )
    
    rem ---------- 追加バッチを管理者として実行 ----------
    if /i not "!L!" == "-" (
        call "%AddBatPath%!L!"
    )
    
    rem ---------- PC名変更 ----------
    if /i not "!B!" == "-" (
        %Windir%\System32\Wbem\Wmic.exe computersystem where name="%COMPUTERNAME%" call rename name="!B!"
    )
    
    rem ---------- 設定情報確認(再度) ----------
    echo ====================設定しました====================
    echo PC名                        :!B!
    echo IPアドレス                  :!C!
    echo サブネットマスク            :!D!
    echo デフォルトゲートウェイ      :!E!
    echo プライマリDNS               :!F!
    echo セカンダリDNS               :!G!
    echo プロキシサーバー            :!H!
    echo 例外設定                    :!I!
    echo 追加ユーザー名              :!J!
    echo 追加ユーザーパスワード      :!K!
    echo 起動バッチ                  :!L!
    echo ====================================================
    goto Complete
    
    
    rem ==================== 処理中止 ====================
    :EXITBAT
    if !Veri!==False  (
        echo リストにありません。
        ping localhost -n 2 > nul
        goto Main
    )
    
    
    rem ==================== 処理完了 ====================
    :Complete
    echo 何かキーを押すと再起動します。
    pause > nul
    shutdown -t 0 -r
    exit

使い方はいたって簡単です。
リストを作ってバッチファイルを管理者権限で実行するだけです。

特に難しい事はやっていないですが、一つ一つ分解して解説します。

バッチファイルを管理者として実行しているか確認

こちらの処理は少々特殊で、バッチファイルが管理者権限で開かれているか確認する処理となります。バッチファイルを普通にダブルクリックで開くと、ユーザー権限となり、システム設定の動作に問題が発生するので、最初に確認を行います。

管理者権限でないと、処理が中止されます。


    rem ==================== 管理者として実行されているか確認 ====================
    NET FILE 1>NUL 2>NUL
    if "%ERRORLEVEL%" == "0" (
        goto title
    ) else (
        echo;
        echo ◆◆◆◆◆管理者権限ではありません。処理を中止します。◆◆◆◆◆
        ping localhost -n 4 > nul
        exit
    )

環境変数を宣言(一番重要)

正直、触るのはココだけでいいはず…
設定をまとめたリストの場所をここで示しています。
また、NICの名前もここで定義しておきます。
追加バッチファイルを読み込む場合は、AddBatPathに実行するファイルが置かれているディレクトリを指定します。


    rem ==================== 環境変数を宣言 ====================
    set ListPathe=%~dp0\list.csv
    set NICname=イーサネット
    set AddBatPath=%~dp0data\
    
    rem ※tempファイルは実行ディレクトリで処理(ここは基本変えない)
    set List_temp=%~dp0_temp_list

リストファイルの存在確認

CSVのリストファイルがあるか確認する処理です。
環境変数の所で指定したパスが正しいかを判断し、なければ処理を終了します。


    rem ==================== リストファイルがあるか確認 ====================
    if exist "%ListPathe%" (goto :seting)
        echo "%ListPathe%"が見つかりません。
        ping localhost -n 5 > nul
        exit
    end if

CSVリストから値を取得

ここではリスト番号を入力し、CSVファイル内から参照します。
値が見つかれば対応した値を引っ張ってきます。
無ければ再度リスト番号の入力を求めます。

ここでの処理は、リストに空欄がある場合の処理も行っております。
リストが不完全だと、思わぬ処理をしかねないので、空欄に「-」を入れる作業もやってます。

また、リストから値を抽出できなければ、エラー処理の方に飛びます。


    rem ==================== リストファイルから値を取得 ====================
    :seting
    set /P ListNo="リスト番号を入力してください:"
    
    rem ----- 不要なtempデータを削除 -----
    if exist %List_temp% del %List_temp% > nul
    
    rem ---------- 空セル・全角「ー」を『-』に置換 ----------
    for /f "usebackq delims=" %%a in ( %ListPathe% ) do (
        set line=%%a
        set line=!line:,,=,-,!
        set line=!line:ー=,-,!
        echo !line!>>%List_temp%
    )
    
    rem ---------- 変数に抽出したトークンを検証 ----------
    set Veri=False
    for /F "USEBACKQ skip=1 delims=, tokens=1,2,3,4,5,6,7,8,9,10,11,12" %%a in ( %List_temp% ) do ( 
        if /i not "%%a" == "" (
            if "%%a" == "%ListNo%" (
                set A=%%a
                set B=%%b
                set C=%%c
                set D=%%d
                set E=%%e
                set F=%%f
                set G=%%g
                set H=%%h
                set I=%%i
                set J=%%j
                set K=%%k
                set L=%%l
                set Veri=True
            )
        )
    )
    
    rem ----- 不要なtempデータを削除 -----
    if exist %List_temp% del %List_temp% > nul
    
    rem ---------- リストからデータを取得できたか確認 ----------
    if !Veri!==True (goto Continued) else (goto EXITBAT)
    
    rem ---------- 抽出したデータの確認 ----------
    :Continued
    echo ================================================
    echo PC名                        :!B!
    echo IPアドレス                  :!C!
    echo サブネットマスク            :!D!
    echo デフォルトゲートウェイ      :!E!
    echo プライマリDNS               :!F!
    echo セカンダリDNS               :!G!
    echo プロキシサーバー            :!H!
    echo 例外設定                    :!I!
    echo 追加ユーザー名              :!J!
    echo 追加ユーザーパスワード      :!K!
    echo 起動バッチ                  :!L!
    echo;
    echo ==========上記設定で処理を行いますか?==========
    set Input=Y
    set /P Input="(Y/N)[Y]:"
    if "%Input%" == "n" (goto title)
    if "%Input%" == "N" (goto title)

処理を実行

リストから取得した値を実際に処理します。
各処理は個別に見てもらうとして、主な注意点だけ。

PC変更の処理を一番最後にしているのは、再起動を伴う処理だからです。
あと、別のバッチファイルを呼び出す処理も入っていますが、本バッチが管理者権限で実行されている為、呼び出された別のバッチファイルも管理者権限で実行されます。
ユーザー権限にて実行したい場合は処理を分ける事を推奨します。


    rem ==================== 処理実行 ====================
    rem ---------- IPアドレス設定 ----------
    if /i "!C!" == "-" (
        netsh interface ipv4 set address name="%NICname%" source=dhcp
        set C=DHCP
        set D=DHCP
        set E=DHCP
    ) else (
        netsh interface ipv4 set address name="%NICname%" static !C! !D! !E! 1
    )
    
    rem ---------- DNS設定 ----------
    if /i "!F!" == "-" (
        netsh interface ipv4 set dnsservers name="%NICname%" source=dhcp validate=no
        set F=DHCP
        set G=DHCP
    ) else (
        netsh interface ip set dns name="%NICname%" static !F! primary validate=no
        if /i not "!G!" == "-" (netsh interface ipv4 add dns name="%NICname%" address=!G! index=2 validate=no)
    )
    
    rem ---------- プロキシサーバー追加 ----------
    if /i "!H!" == "-" (
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 0
    ) else (
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t reg_sz /d !H!
        reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyOverride /t reg_sz /d "!I!"
    )
    
    rem ---------- ユーザー追加 ----------
    if /i not "!J!" == "-" (
        net user !J! /add
        rem pass追加
        if not "!K!" == "-" (
            net user !J! !K!
        )
    )
    
    rem ---------- 追加バッチを管理者として実行 ----------
    if /i not "!L!" == "-" (
        call "%AddBatPath%!L!"
    )
    
    rem ---------- PC名変更 ----------
    if /i not "!B!" == "-" (
        %Windir%\System32\Wbem\Wmic.exe computersystem where name="%COMPUTERNAME%" call rename name="!B!"
    )
    

処理中止と処理完了

最後はエラー処理の場合と正常処理の場合の記述です。

リストから値が抽出されなければ、処理中止のコマンドが実行されます。

全ての処理が完了すると、再起動のコマンドが実行されます。


    rem ==================== 処理中止 ====================
    :EXITBAT
    if !Veri!==False  (
        echo リストにありません。
        ping localhost -n 2 > nul
        goto Main
    )
    
    
    rem ==================== 処理完了 ====================
    :Complete
    echo 何かキーを押すと再起動します。
    pause > nul
    shutdown -t 0 -r
    exit

最後に

ネットワーク設定の自動化を行うためにやったのですが、結果としてうちはDHCP(IP自動割り振り)を行ったので、無用の長物となりましたことをここに書き記します。

いや、というのも、このバッチを作ったのは前職の設定作業でサボる業務を効率化するために作った物です。

自動化することでミスも減りますし、今後の作業が格段に楽になります。

正直このバッチは有料級の物なんじゃないかと思いますが、どこかの誰かの役に立つのであれば、供養されることでしょう。(需要あるかな?)

貴方の不動産お悩み相談窓口

(お奨めの新築物件もありますよ~)

 

New ホームページ → Mrs.living WEB

 

不動産調査・価格査定も無料で行っています。

 

簡単査定依頼→ クリックして依頼して下さい!

 

 

ファイナンシャルプランナー宅地建物取引士が貴方様の大切な不動産のご相談に乗らせていただきます。

電話:098-923-2981

 

対面ではちょっと・・・そんな照れ屋さんもハート

FAX:098-923-2982

お問合せ:https://mrs-living.ne.jp/contact

 

ご来店の際は 県道6号線沿い、読谷診療所斜め向かいのオレンジこげ茶の建物が目印

GoogleMAP:(地図はこちら)

 

ナビでお越しの際は 「ミセス・リビング」又は、

「読谷村字波平2427-2」と入力してください。

 

それでは、貴方様のご来店を心よりお待ちしております。

 

●○●○●○●○●○●○●○●○●○●○●○●

ミセス・リビング

読谷村字波平2427-1 1F

TEL098-923-2981

FAX098-923-2982

お問合せはこちらから https://mrs-living.ne.jp/contact

ホームページ:https://mrs-living.ne.jp

●○●○●○●○●○●○●○●○●○●○●○●