2009/02/27

[bat][バッチ][コマンドライン]Windowsのバッチとかコマンドラインとか

WS0594
会社と家でネットワークの設定を切り替えたりしたい時。IPアドレス等の設定って面倒ですよね。わざわざネットワークの設定画面開くのとか。
会社でノートパソコン使ってる人なんかは、家と会社で設定が違うので大変です。今までは、拾ってきたバッチを使ってたんですが、懐かしくってちょっとバッチプログラミングしてみましたので晒してみます。
下の方に一部解説とか、小技載せてみましたw
結構おもしろかった(笑)こんどWindows DOS/コマンドプロンプト辞典でも読みなおして遊んでみようかな~w

今まで使ってたやつ。
これらを家で会社でコマンドランチャからピコってやってます。
@Rem IPON.bat
@Rem 会社用
netsh interface ip set address "ローカル エリア接続" static 192.168.1.215 255.255.255.0 192.168.1.254 none
netsh interface ip set dns "ローカル エリア接続" static 192.168.1.254
@Rem IPOFF.bat
@Rem 家
netsh interface ip set address "ローカル エリア接続" dhcp
netsh interface ip set dns "ローカル エリア接続" dhcp


で、別に上記のものでよかったのですが、というより、上記のものの方が良かったかもしれませんが、ONとOFFを一緒くたにしたのを作ってみました。結構楽しかったw
(コピーすれば使えますが、DEFAULTラベルのところの値はお使いの環境用に書き換えて下さい。)
@Echo Off
Echo ---------------------------------------------------
Echo ---    Change Network Config            ---
Echo ---    2009/02/26 valvallow            ---
Echo ---------------------------------------------------

:TOP

Echo.
Set AREA="ローカル エリア接続"
Set line=---------------------------------------------------

IPConfig | Find ". : "
Echo.

:Menu
Echo %line%
Set /p m="* Select memu 0:? / 1:on / 2:off / 3:end * "

If %m%==0 (GoTo HELP)
If %m%==1 (GoTo IP_ON_CONFIG)
If %m%==2 (GoTo EXEC_OFF)
If %m%==3 (GoTo END) ELSE (GoTo END)

:IP_ON_CONFIG
Echo %line%
Set /p m="* 0:input / 1:default * "
If %m%==0 (GoTo INPUT)
If %m%==1 (GoTo DEFAULT) ELSE (GoTo END)

:DEFAULT
Set IP=192.168.1.215
Set SubNetMask=255.255.255.0
Set DefaultGateway=192.168.1.254
Set DNS=192.168.1.254
GoTo EXEC_ON

:INPUT
Echo %line%
Set /p IP="IP Address = "
Set /p SubNetMask="Sub Net Mask = "
Set /p DefaultGateway="Default Gateway ="
Set /p DNS="DNS = "
GoTo EXEC_ON

:EXEC_ON
Echo %line%
Echo AREA=%AREA%
Echo IP=%IP%
Echo SubNetMask=%SubNetMask%
Echo DefaultGateway=%DefaultGateway%
Echo DNS=%DNS%
Echo %line%
Echo now setting....
Netsh Interface IP Set Address %AREA% static %IP% %SubNetMask% %DefaultGateway% none
Netsh Interface IP Set DNS %AREA% static %DNS%

Echo %line%
IPConfig | Find ". : "
GoTo END

:EXEC_OFF
Echo %line%
Echo AREA=%AREA%
Echo IP=""
Echo SubNetMask=""
Echo DefaultGateway=""
Echo DNS=""
Echo %line%
Echo now setting....
Netsh Interface IP Set Address %AREA% dhcp
Netsh Interface IP Set DNS %AREA% dhcp

Echo %line%
IPConfig | Find ". : "
GoTo END

:HELP
Echo %line%
Echo "Help"
Echo 0:?    Call Help
Echo 1:on    Network Configs ON (Input or Default Values)
Echo 2:off    Network Configs OFF (To Empty)
Echo 3:end    Exit this bat
GoTo Menu

:END

Echo %line%
Set /p continue="* Exit or Continue? e/c * "
If %continue%==c (GoTo Menu)

Set AREA=""
Set IP=""
Set SubNetMask=""
Set DefaultGateway=""
Set DNS=""
Set continue=""
Set line=""
Set m=""

:EOF



少しだけかいつまんで解説でも。
Setで変数に値をセット。
Set hoge="hoge"
Set moge=1

変数を使用する際は%で囲む。
Echo %hoge%
実行するとコンソールにhogeってでます。

コメント
Rem コメント

出力
Rem コンソールに出力
Echo Hello, worlld !!

Rem 指定したテキストに出力
Echo Hello, world !! > C:\log.log

Rem 指定したテキストに追記
Echo Hello, world !! >> C:\log.log

Rem どこにも出力しない
Echo Hello, world !! > nul

Rem 改行
Echo.

条件分岐 ()で囲めば複数のコマンド可
If %m%==3 (GoTo END) ELSE (GoTo END)

入力を変数に受け取る Set /p 変数
Set /p m="* Select memu 0:? / 1:on / 2:off / 3:end * "

パイプ(コマンドの出力を次のコマンドに渡す)
Rem IPConfigの結果から". : "という文字列がある行だけ出力
IPConfig | Find ". : "

ラベル (GoTo ラベル名 でジャンプ)
:DEFAULT



以下、上記のファイルとは関係ありませんが・・・
今日の日付が取れます。
下記の結果は20090227
Echo %date:/=%


forループもあります。
下記の例だと192.168.1.1 ~ 192.168.1.254までのIPアドレスにpingを打ちます(笑)ping結果はIP.txtに保存されます。意外に結構役に立つ。
for /L %%f in (1,1,254) do ping -n 1 -w 50 192.168.1.%%f >>IP.txt


後は関係ないけど、SQLサーバー向けとか、思い出したのでついでに。
SQLServerが入ってれば・・・
クエリ発行バッチとか作れたりします。
@SET /p SERVERNAME="サーバー名→"
@SET /p DBNAME="データベース名→"
@SET /p USERNAME="ユーザー名"
@SET /p PASSWORD="パスワード→"

@SET Q="DELETE FROM HogeTable"
@osql -U%USERNAME% -P%PASSWORD% -S%SERVERNAME% -d%DBNAME% -Q%Q%

もちろんSELECTも可。結果がコンソールに表示される。
@SET /p SERVERNAME="サーバー名→"
@SET /p DBNAME="データベース名→"
@SET /p USERNAME="ユーザー名"
@SET /p PASSWORD="パスワード→"

@SET Q="SELECT * FROM HogeTable"

@osql -U%USERNAME% -P%PASSWORD% -S%SERVERNAME% -d%DBNAME% -Q%Q%

さらに関係ないけど、しょぼいフォルダ検索とかw
Pathに探したいディレクトリのパス、eに拡張子を入れると、ヒットしたファイルがコンソールに一覧され、冗長ですが、ログファイルにも同じだけループして結果を書き出します。(再帰探索はしません)
ポイントはログ名。「%~n0」で実行されている自分自身の名前を取れます。
@Set /p d="Path : "
@Set /p e="Extention : "
@Echo ---------------------------------------------------
@for %%a in (%d%\*%e%) do @echo %%a
@for %%a in (%d%\*%e%) do @echo %%a >>%~n0.log
@Echo ---------------------------------------------------
@Echo ----- Press any key to exit -----
@pause > nul

参考はこちら
netsh interface ipコマンドでIPアドレスを設定する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060809/245476/
持ち歩いているノート PC で簡単に TCP/IP の設定を変えたい
http://www.monyo.com/technical/windows/26.html
Rem ローカルエリア接続設定切替え用スクリプト(Windows2000/XP)
http://www.bais.chubu.ac.jp/~tatsuoka/apnet21/page2.html


Windows DOS/コマンドプロンプト辞典マスタリングTCP/IP 入門編 第4版 プログラマのためのSQL 第2版SQL Hacks ―データベースを自由自在に操るテクニック

0 件のコメント:

コメントを投稿