質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

3回答

3693閲覧

DOSコマンドでIPCONFIGからIPアドレスを抽出しlnkファイルを作成するバッチファイルを作りたい

JuguarSugar

総合スコア83

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2020/05/18 07:01

編集2020/05/18 07:07

タイトルの通りとなります。
一通りググってみてFor文の中でipconfigとfindstrを使いIPアドレスをトークンに格納する方法が良さそうでしたので自分で下記のバッチファイルを書いてみたのですが動作しません。

@echo off
FOR /F "tokens=1,2 usebackq delims=:" %%i IN (ipconfig | findstr /n /r ":14") do (
mklink C:\test.lnk %%j\C$
)
pause

ipconfigを実行した際にIPアドレスが14行目に書いてある想定で書いております。
手順としてはipconfigのIPアドレスが書いてある14行目を:(コロン)で区切ってトークンに格納し、IPアドレスが書いてある2番目のトークンをmklinkにて使ってIPアドレスの入ったショートカットtest.lnkを作成するつもりで書いたのですが機能しません。

実際には仮想環境にこちらのバッチファイルを置いて、ipconfigのデフォルトゲートウェイを抽出し、ホストサーバーとの共有フォルダを使うために必要です。

以上になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

プログラム(スクリプト)は一歩ずつ作ります。
まず、ipconfig | findstr /n /r ":14"の出力が期待通りか調べるのが第一歩です。

質問文からうかがえるのは、このコマンドで14行目が取り出せると思っているようですが、これは:14を含む行を取り出すコマンドです。

14行目を取り出したければ、まず行番号を付けてから14を探すという2段階必要です。

CMD

1:行番号を付ける 2ipconfig | find /v /n "" 3:その行を選択する 4ipconfig | find /v /n "" | findstr /b /c:[14] 5

ただ、for /fの機能で「先頭から指定行読み飛ばす」というのがあるので「先頭から13行読み飛ばす」と簡単です。15行目を処理しないようにgotoでループを抜けます。

CMD

1for /f "skip=13 delims=: tokens=2" %%A in ('ipconfig') do ( 2 set IP=%%A 3 goto NEXT 4) 5:NEXT 6以下%IP%を使った処理

何行目にIPアドレスが出るかは、個々のPCの環境によって異なるので、全く同一構成のPCだけ対象にするのでない限り、行数を使うのは止めた方が良いです。

投稿2020/05/18 07:36

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JuguarSugar

2020/05/18 07:44

回答ありがとうございます。 おかげ様でfindstrで行を取り出す方法が理解できました。 具体例交えていただき誠に分かりやすかったです。 他の方の回答も大変参考になりました。 ありがとうございました。
guest

0

とりあえず2点問題があります。

  1. forで実行するコマンドを引用符で囲っていない
  2. forの中で|をエスケープしていない

1.に関しては、usebackqを指定してるのでバッククォートを引用符として使う必要があります。
2.に関しては^でエスケープする必要があるので^|と記述する必要があります。

なお、1.はfor /?で表示されるヘルプに書いてあることです。
2.は「bat pipe escape」とかでググると解説してるページがたぶんいっぱい出てきます。

投稿2020/05/18 07:32

編集2020/05/18 07:37
gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JuguarSugar

2020/05/18 07:45

回答ありがとうございました。 おかげ様で解決致しました。
guest

0

最初の行の@echo off を削除あるいはコメントアウトして、実行させましょう。
なにがアカンのか表示してくれます

ましかし、コマンドプロンプトで
ipconfig | findstr /n /r ":14"
を実行させても、なにもでてきませんね

投稿2020/05/18 07:12

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JuguarSugar

2020/05/18 07:31 編集

回答ありがとうございます。 @echo offを削除してみたのですが実行した直後にプロンプトが落ちてしまいました... また、ネットに落ちていたものをコピペして下記のコードにしたところうまく動作しました。 FOR /F "tokens=1,2* usebackq delims=:" %%i IN (`ipconfig ^| findstr /n /r "." ^| findstr /r "^55:"`) do ( mklink C:\test.lnk %%k\C$ ) pause ただ、正直findstrの部分がよくわかっておらず、何故このコードで任意の行を読み取れてるのかが分かりません@@; あとIPアドレスが載ってるのが14行目ではなく55行目でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問