[前の記事]« DIRとFINDの組み合わせでフォルダ名とファイル名を検索
[次の記事]多数のファイルを一括してFINDでチェックしたい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「IPCONFIG」索引へ
▲カテゴリー「PING」索引へ
▲カテゴリー「SET, PATH, %環境変数%」索引へ

Pingの結果のIPアドレスを抽出して環境変数にSETしたい

1023.
Pingの結果のIPアドレスを環境変数にSET
2006年02月26日(日) 23時59分
atawi
●DOS/Windowsのバージョン↓

Windows 2000, XP

再び、お世話になります。
みなさんのご意見を何卒よろしくお願いいたします。

以下のようにPingを打ち、その結果をリダイレクトします。

Ping %COMPUTERNAME% >IP.txt

その結果から、

Pinging ComputerName [xxx.xxx.xxx.xxx] with 32 bytes of data:

の[]で括られたIPアドレスの部分を抽出し、
それを環境変数にSETしようとしています。
※IPアドレスの文字数は不定です。

for コマンドのdelimsオプションを使えばできるのか、findstrコマンドを使うのか? という感じで、発想の段階でつまづいています。
そもそもOS標準コマンドだけでは無理でしょうか。

※最終的には、このIPに対応したMACアドレスも環境変数にSETできたらいいなぁ、と思っていますが、どうも難しそう。というわけでとりあえず、IPから・・・
1024.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 09時33分
ラシャン
Ping %COMPUTERNAME% ってことは、自身のIPやMACアドレスを環境変数にSET出来れば良いのでしょうか?
それならipconfigで以下のような感じでどうでしょうか?

@echo off
for /f "tokens=14 delims=: " %%a in ('ipconfig ^| find "IP Address"') do set IP=%%a
for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set MAC=%%b
echo IPアドレスは [%IP%] です。
echo MACアドレスは [%MAC%] です。
pause

1027.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 12時49分
atawi
ラシャン様

早速の書き込みありがとうございます。

おお~ なるほど~ すばらしい。

でも実は… iconfig や getmac から値を取得する場合、
複数アダプタを持つPCの場合に困ってしまいます。
最近は無線LANなど複数アダプタを持つPCも多くて…

考えて頂いたスクリプトの場合、最後に発見されたIPと、
MACを変数に入れることになると思うのです。

なので、ログオンスクリプトで処理することを想定し、
自分へのPingに対して、応答があるIPと、
それに対応するMACを取得したい、というのが狙いでした。

と、今ここまで書いて思ったのですが、
ipconfigからの取得をする場合でも、
環境変数を複数設定して、繰り返し

IP1,IP2~, MAC1,MAC2~と全部出力すればいいのか!

え~と?
findの結果を見つかった数だけ変数に入れるには…?
/L オプションで… いやtokenの指定で*を…??

forコマンドは難しくてよく理解できていませんが、
とりあえず試行錯誤してみます。
1028.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 14時52分
atawi
いや、やっぱりだめでした。

tokenの引数は、各行に対するもので、
「*」も、残りの行に対するものではなく、
その行の残りのテキストを渡すものでした。

/F と /L は同時に指定できないようだし…

do 以下で、以下のように、
繰り返し for /L in do を指定してみました。

for /f "tokens=14 delims=: " %%i in ('ipconfig ^| find "IP Address"') do for /L %%a in (1,1,3) do echo SET%%a=%%i

これも、取得したIPアドレス「それぞれ」に対し、
複数回(例の場合3回)、SETを実施するだけなので、
結局意味を成しません。以下のように、

SET IP1=取得したIP1
SET IP2=取得したIP2
SET IP3=取得したIP3

のようなコマンドを実行したい場合は、どうすればよいのでしょう?
変数の数が、取得したIPの数と同じになるとなおよいのですが。

findした結果の行数を取得して渡す必要があるかな?
…もうしばらく考えて見ます。
1031.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 17時21分
otn
>いや、やっぱりだめでした。

こんな感じで。

set N=0
for /f "tokens=14 delims=: " %%a in ('ipconfig ^| find "IP Address"') do set /a N+=1&call call set IP%%N%%=%%a

if defined IP1 echo IP Address #1 %IP1%
if defined IP2 echo IP Address #2 %IP2%
if defined IP3 echo IP Address #3 %IP3%

1033.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 19時42分
atawi
otn様 書き込みありがとうございます。

なるほど~ SETコマンドには、/A で演算子が使えたんですね…

SETの方でなんかやらなくてはいけないのだろう、
とは思ったのですが、SETのヘルプの読み込みが甘すぎたようです。

今回は、

・単純な繰り返し以外のfor in doの使用法がなんとなく理解できた(ような…)。
・SETでは演算子が使える
・IF DEFINEDで環境変数の有無が判別ができる。
・''内で|を記号と認識させるため^が必要?

ということが収穫になったと思います。
ラシャン様、otn様、ありがとうございました。


しかし、実はまだわからない点もあります。
set /a N+=1&call call set IP%%N%%=%%a

にある、call の記述の意味がよく理解できません。
繰り返し記述されているのも、なぜ?という感じです。
別のバッチを呼んでいるわけでもないようですし、
CALLのヘルプにある修飾子とも関係ないように思えます。
SETのヘルプにもCALLの記述はありませんでした。

助言をいただければ幸いです。

以下は、動作を確認した、IPとMACを取得するバッチです。
※サルマネですけれども…

@echo off

set N=0
for /f "tokens=14 delims=: " %%a in ('ipconfig ^| find "IP Address"') do set /a N+=1&call call set IP%%N%%=%%a

set N=0
for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set /a N+=1&call call set MAC%%N%%=%%b

CLS
if defined IP1 echo IP1 = %IP1%
if defined IP2 echo IP2 = %IP2%
if defined IP3 echo IP3 = %IP3%
if defined MAC1 echo MAC1 = %MAC1%
if defined MAC2 echo MAC2 = %MAC2%
if defined MAC3 echo MAC3 = %MAC3%

PAUSE
1034.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月27日(月) 20時21分
otn
>・IF DEFINEDで環境変数の有無が判別ができる。

変数に空をセットすると未定義になるので、IF "%IP1%"=="" でも実質同じですけど、IF DEFINED の方が目的が明確になります。

>・''内で|を記号と認識させるため^が必要?

^ をつけないと、そこでfor文が終わりとみなされます。
正確には、「" "の外、かつ、パイプ処理以外、かつ、||によるor処理以外」で | を使うときは ^ が必要となります。
& も同じ。

>しかし、実はまだわからない点もあります。
>set /a N+=1&call call set IP%%N%%=%%a

あいや。call は1つで十分でした。
<set /a N+=1&call set IP%%N%%=%%a

この命令は %% が % に置換されれるので、
call set IP%N%=%a
になります。さらに call の機能で %N% が置換され、
set IP1=%a
等になります。他の言語で言うと、eval のような働き。
この機能は、call /? には載ってません。

他にはcallを使わない方法として、遅延展開を有効にして、
set IP!N!=%%a
でもいいです。
1035.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月28日(火) 10時56分
ラシャン
わたしも勉強になりました。
ありがとうございました^^
1036.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月28日(火) 12時57分
atawi
見本を示すだけでなく、解説までしていただき、
ありがとうございます。

>この機能は、call /? には載ってません。

ヘルプにない機能まであるとは…
奥が深いですね。

他言語を知っていると、色々応用が効くのですね。
貴重な情報を頂きました。

>遅延展開

このあたりでしょうか。
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/set_path/cat51/1-0461.html
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/set_path/cat51/4-0237.html

うーん。他の記述の仕方ができるならば、
正直敷居が高い感じはしますが、
ぜひ参考にさせていただきたいと思います。

回答してくださった方にあらためてお礼を申し上げます。
ありがとうございました。

以下、とりあえず完成版(コメントにNT4での記述を追記)。

@echo off

set N=0
for /f "tokens=14 delims=: " %%a in ('ipconfig ^| find "IP Address"') do set /a N+=1&call set IP%%N%%=%%a
REM NTの場合は、tokens=11

set N=0
for /f "tokens=11 delims=: " %%b in ('ipconfig /all ^| find "Physical Address"') do set /a N+=1&call set MAC%%N%%=%%b
REM NTの場合は、tokens=8

CLS
if defined IP1 echo IP1 = %IP1%
if defined IP2 echo IP2 = %IP2%
if defined IP3 echo IP3 = %IP3%
if defined MAC1 echo MAC1 = %MAC1%
if defined MAC2 echo MAC2 = %MAC2%
if defined MAC3 echo MAC3 = %MAC3%

PAUSE
1037.
Re:Pingの結果のIPアドレスを環境変数にSET
2006年02月28日(火) 14時25分
otn
>以下、とりあえず完成版(コメントにNT4での記述を追記)。

for /f "tokens=%TT% delims=: "
のように変数が使えるので、ver コマンドでバージョンを調べて変数をセットすれば、
同じ記述でどのWindowsでも動くように出来ます。

ver コマンドでバージョンを調べるサンプルも多分過去ログにあると思います。

1048.
Re:ipconfigの結果からIPとMACを環境変数にSET
2006年03月04日(土) 10時41分
atawi
内容に沿って、タイトル変更しました。
OSの種類をしらべて各OSに対応する版です。

Windows 2003 Serverは実機が手元にないので、確認できてません。
ipconfigの結果の書式はXPと同じだろう、という前提です。

9x系でも動くようになるといいんですが、
Sedとかを使わないとだめですかねぇ・・・


CLS
@ECHO OFF
PROMPT $S
IF "%OS%"=="Windows_NT" GOTO NTOS
IF "%OS%"=="" GOTO 9xOS
GOTO END

:NTOS
FOR /f "TOKENS=1-3" %%i IN ('VER') DO SET OSVER=%%k
IF "%OSVER%"=="Version" ( SET TOKENIP=11 & SET TOKENMAC=8 & GOTO GETIPMACNT )
IF "%OSVER%"=="2000" ( SET TOKENIP=14 & SET TOKENMAC=11 & GOTO GETIPMACNT )
IF "%OSVER%"=="XP" ( SET TOKENIP=14 & SET TOKENMAC=11 & GOTO GETIPMACNT )
IF "%OSVER%"=="[Version" ( SET TOKENIP=14 & SET TOKENMAC=11 & GOTO GETIPMACNT )
GOTO END

:9xOS
VER | FIND "95" > NUL
IF NOT ERRORLEVEL 1 GOTO :95
VER | FIND "98" > NUL
IF NOT ERRORLEVEL 1 GOTO :98
VER | FIND "Millennium" > NUL
IF NOT ERRORLEVEL 1 GOTO :Me
GOTO END

:95
:98
:Me
GOTO GETIPMAC9x

:GETIPMACNT
SET N=0
FOR /f "TOKENS=%TOKENIP% delims=: " %%a IN ('ipconfig ^| find "IP Address"') DO SET /a N+=1&call SET IP%%

N%%=%%a
SET N=0
FOR /f "TOKENS=%TOKENMAC% delims=: " %%b IN ('ipconfig /all ^| find "Physical Address"') DO SET /a

N+=1&call SET MAC%%N%%=%%b
CLS
ECHO.
IF DEFINED IP1 ECHO. IP1 = %IP1%
IF DEFINED MAC1 ECHO. MAC1 = %MAC1%
ECHO.
IF DEFINED IP2 ECHO. IP2 = %IP2%
IF DEFINED MAC2 ECHO. MAC2 = %MAC2%
ECHO.
IF DEFINED IP3 ECHO. IP3 = %IP3%
IF DEFINED MAC3 ECHO. MAC3 = %MAC3%
ECHO.
GOTO END

:GETIPMAC9x
GOTO END

:END
ECHO. 終了するには何かキーを押して下さい...
PAUSE>NUL

 
 


カテゴリー「IPCONFIG」索引へ
カテゴリー「PING」索引へ
カテゴリー「SET, PATH, %環境変数%」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2006年02月26日 10:39に投稿されたエントリーのページです。

ひとつ前の投稿は「DIRとFINDの組み合わせでフォルダ名とファイル名を検索」です。

次の投稿は「多数のファイルを一括してFINDでチェックしたい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
 
このブログについて | 運営:有限会社メディアポート