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

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

新規登録して質問してみよう
ただいま回答率
85.40%
DNS

DNSとは、Domain Name Systemのことで、インターネットなどのTCP/IPネットワーク上でドメイン名やホスト名と、IPアドレスとの対応づけを管理するシステムです。DNSのデータベースは、IPアドレスの4つの数字を通知するDNSサーバーで構築されており、IPアドレスをドメイン名から引き出す機能やドメイン名に関するメールサーバ情報を取り扱っています。

バッチファイル

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

Q&A

解決済

1回答

293閲覧

バッチ 代替DNSサーバ 指定と削除

Gohandaisuki

総合スコア1

DNS

DNSとは、Domain Name Systemのことで、インターネットなどのTCP/IPネットワーク上でドメイン名やホスト名と、IPアドレスとの対応づけを管理するシステムです。DNSのデータベースは、IPアドレスの4つの数字を通知するDNSサーバーで構築されており、IPアドレスをドメイン名から引き出す機能やドメイン名に関するメールサーバ情報を取り扱っています。

バッチファイル

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

0グッド

0クリップ

投稿2024/07/04 12:08

実現したいこと

こんにちは、初めまして

netsh interface ip show dns name=イーサネット
インターフェイスの構成 "イーサネット"
静的に構成された DNS サーバー: 8.8.8.8
8.8.4.4
次のサフィックスで登録します: プライマリのみ から優先

バッチ処理にて、代替DNSサーバのアドレスを8.8.4.4に指定するファイルを作りたいです

代替DNSサーバがない場合は8.8.4.4を指定し、既にある場合は元々あった代替DNSサーバをログに残して、8.8.4.4に指定したいです

発生している問題・分からないこと

優先DNSサーバのアドレスと代替DNSサーバのアドレスを変数に格納するのが上手くいかないです。

エラーメッセージ

error

1ECHO は <OFF> です。

該当のソースコード

@echo off setlocal REM 設定 set interface="イーサネット" set secondaryDNS=8.8.4.4 set logFile=D:\LOGS\dp0dns_backup.log REM ログファイルに日付と時間を追加 echo %date% %time% >> %logFile% REM 現在のDNS情報を取得しログ出力 echo 現在のDNS情報を取得中... >> %logFile% netsh interface ip show dns name=%interface% >> %logFile% REM 現在の優先DNSサーバを取得 set primaryDNS= for /f "tokens=3 delims= " %%a in ('netsh interface ip show dns name=%interface% ^| findstr /r /c:"^ *DNS Servers"') do ( if not defined primaryDNS ( set primaryDNS=%%a ) ) echo %primaryDNS% >> %logFile% REM セカンダリが設定されているかチェック set currentSecondaryDNS= for /f "tokens=3 delims= " %%a in ('netsh interface ip show dns name=%interface% ^| findstr /r /c:"^ *DNS Servers"') do ( if defined primaryDNS if not "%%a"=="%primaryDNS%" ( set currentSecondaryDNS=%%a goto :foundSecondary ) ) :foundSecondary if defined currentSecondaryDNS ( REM セカンダリDNSが設定されている場合 echo セカンダリDNSが設定されています。 >> %logFile% if "%currentSecondaryDNS%"=="%secondaryDNS%" ( REM セットしようとしているIPと同じ場合 echo セカンダリDNSは既に %secondaryDNS% に設定されています。処理を終了します。 >> %logFile% exit /b 0 ) else ( REM セットしようとしているIPと異なる場合 echo 現在のセカンダリDNS %currentSecondaryDNS% を削除します。 >> %logFile% netsh interface ip delete dns name=%interface% addr=%currentSecondaryDNS% >> %logFile% ) ) REM 優先DNSを再設定(保持) if defined primaryDNS ( echo 優先DNSを %primaryDNS% に再設定します。 >> %logFile% netsh interface ip set dns name=%interface% source=static addr=%primaryDNS% >> %logFile% ) REM セカンダリDNSをセットする echo セカンダリDNSを %secondaryDNS% に設定します。 >> %logFile% netsh interface ip add dns name=%interface% addr=%secondaryDNS% index=2 >> %logFile% REM 最終結果ログ出力 echo セカンダリDNSの設定が完了しました。 >> %logFile% exit /b 0

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

チャットGPTに聞いてもよくわからなかったです。

補足

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、@echo offを付けるのはデバッグが完了して正常動作を確認できてからです。

環境変数設定後に、netsh interface ip show dns name=%interface% >> %logFile%を追加して、コマンドの出力を確認しましょう。意図しているものと違うはずです。
コマンドの結果に合わせて、findstrの文字列や、取り出すトークン番号を決めましょう。
(追記) 失礼しました。上記コードはもともと入ってましたね。ただ、Windows10の場合、コマンドプロンプトが日本語モードでもUSモード、UTF8モードでもfindstrにお書きの文字列とはマッチしないですし、tokens番号も違います。netshの出力がOSによって違って、お使いのWindowsではそれで合ってるなら、下記の=だけ直せば良いかと思います。(追記終わり)

for /f "tokens=3 delims= " %%a in ('netsh interface ip show dns name=%interface% ^| findstr /r /c:"^ *DNS Servers"') do (
とお書きですが、二重引用符(")の外の=は、CMD.EXEの組み込みコマンドや構文の多くの場所で空白扱いなので(下記注)、上記は、
for /f "tokens=3 delims= " %%a in ('netsh interface ip show dns name %interface% ^| findstr /r /c:"^ *DNS Servers"') do (
と同じで、netshコマンドの構文エラーでしょうね。これも@echo offを書いてなくて、かつ、注意深ければ気づけたはずです。|^|と書いたように、この=^=と書きましょう。

netshでDNSをセットした経験が無いので、取得の部分しか見てませんが、後半はforがないので割と普通に書いても大丈夫でしょう。

注:=が空白になる参考例
for %%A in (A=B "A=B") do echo %%A

どういう場所では空白になって、どういう場所ではそのままかを網羅的に書いてある公式なリストは見たことないです。
CMD.EXE組み込みコマンドの一部と、for等ですね。=だけでなく,;も同じ。
まあ、@echo offしてなければすぐ気づけます。

投稿2024/07/04 13:56

編集2024/07/04 14:13
otn

総合スコア85458

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

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

Gohandaisuki

2024/07/08 01:06

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問