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

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

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

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

バッチファイル

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

Q&A

解決済

1回答

6590閲覧

iniファイルと連携 / 選択したものを変数の値にする方法

退会済みユーザー

退会済みユーザー

総合スコア0

コマンドプロンプト

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

バッチファイル

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

0グッド

0クリップ

投稿2019/02/21 13:41

バッチファイルの作成は今日始めた初心者です。
良いタイトルが思いつかず変な日本語にってしまいましたが、iniファイルに入力した内容を選択肢に出して、内容またはタイプ番号を送信すると、選択した内容を変数として登録するような仕組みを作りたいです。

下に載せたのiniファイルの設定で例えると、worldまた2と打つと、selectedという変数にworldという値を与えるなどです。
iniファイルの内容が「(変数)=(値)」となるように設定してあります。

ini

1; config.ini 2 3[Types] 4type0=hello 5type1= 6type2=world 7type3= 8type4= 9type5= 10type6= 11type7= 12type8= 13type9=

そして、バッチファイルを起動すると、

hello [0] type [2] 選択してください。 >

という風に表示したいです。
全然できなくて色々いじった結果以下のようになりました。
そしたら、welcomeとか1とか適当に書いても次のコマンドに行くようになってしまいました。(gotoコマンドで戻るはずなのに)
最終的にif definedを消したり数値だけで選択するように文を消していったのですが、それでも治らないので萎えました。

bat

1rem main.bat 2 3@echo off 4setlocal enabledelayedexpansion 5for /f "tokens=1,* delims==" %%a in (config.ini) do ( 6 set %%a=%%b 7) 8 9:selectType 10powershell sleep 1 11echo; 12if defined version0 echo - %type0% [0] 13if defined version1 echo - %type1% [1] 14if defined version2 echo - %type2% [2] 15if defined version3 echo - %type3% [3] 16if defined version4 echo - %type4% [4] 17if defined version5 echo - %type5% [5] 18if defined version6 echo - %type6% [6] 19if defined version7 echo - %type7% [7] 20if defined version8 echo - %type8% [8] 21if defined version9 echo - %type9% [9] 22echo; 23 24set /p selectType="> " 25if "%selectType%" == "0" ( 26 set selectType=%type0% 27) else if "%selectType%" == "1" ( 28 set selectType=%type1% 29) else if "%selectType%" == "2" ( 30 set selectType=%type2% 31) else if "%selectType%" == "3" ( 32 set selectType=%type3% 33) else if "%selectType%" == "4" ( 34 set selectType=%type4% 35) else if "%selectType%" == "5" ( 36 set selectType=%type5% 37) else if "%selectType%" == "6" ( 38 set selectType=%type6% 39) else if "%selectType%" == "7" ( 40 set selectType=%type6% 41) else if "%selectType%" == "8" ( 42 set selectType=%type6% 43) else if "%selectType%" == "9" ( 44 set selectType=%type9% 45) else if "%selectType%" == "quit" ( 46 goto quit 47) else if "%selectType%" == "q" ( 48 goto quit 49) else ( 50 echo タイプが不正です。 51 goto selectType 52) 53 54echo; %selectTypeName%が選択されました。 55endlocal 56timeout 5 57exit 58 59:quit 60echo; 選択されませんでした。 61endlocal 62timeout 5 63exit 64

改善策を御教授ください。

複雑でも良いのですが、不適切なコードは直したので、気持ち悪い部分や、書き方が適切でない場所がありましたら、そちらもご報告ください。


また、iniファイルの中にある物を変数に変える

bat

1for /f "tokens=1,* delims==" %%a in (config.ini) do ( 2 set %%a=%%b 3)

というコマンドですが、よくわからないので、意味を教えてください。
また、もっと良い文がありましたら、教えてください。

よろしくお願いします。

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/21 20:19

まず、質問は原則1つだけにしてください。 次に内容が分かっていないものをコピペで使っておいて、こうすればできるはず、というのは論外です。 必ず、内容を理解してお使いください。 上記2点を踏まえると、あなたの場合、今回は、「for /fによるパースの方法を知りたい」、だけが該当するのだと思います。 すると、まず言えることは、 「コマンドプロンプトから標準で使用できるコマンドは、内部コマンドであっても、外部コマンドであっても、 コマンド名 /? でヘルプを見ることができる」 ということです。 今回で言えば for /? ですね。 この出力をよく読み、for /fだとどういう処理がなされるのか調べてから、それを実際に自分で試してみて、それでも不明な部分が少しでもあったら、その部分のみググって調べてみて、それでも分からないことがあった場合だけ、ご質問ください。 なお、バッチファイルというのは、MS-DOS自体からあるとても古いもので、現在のWindowsだと、全てのサポートされているバージョンでPowerShell(もしくはVBScript)が使えるはずです。 PowerShellであれば、.NETの機能を使用してスクリプトを書くことができるので(実際にランタイムだけでコンパイルしてロードなどもできます)、何でもできると思いますし、普通にスクリプトとして使用しても、バッチファイルよりは強力です。 なので、今からわざわざバッチファイルを勉強するよりは、PowerShellから始めるというのも選択肢の1つです。 ただ個人的にPowerShellは以下4点ほど懸念があると思います。 ・セキュリティ面を配慮しすぎるきらいがあり、デフォルトで普通には動作せず、バッチファイルからPowerShellを特殊なポリシー設定で起動しないといけない ・そもそもWindowsのドメイン上のポリシーで実行禁止運用となっている企業さんがそこそこいる ・バージョンごとに動作が異なる部分が多く、新しいバージョン用に作られたスクリプトが古いバージョンで動作しない ・さらに新しいPowerShell Coreに置き変わろうとしている なので、実際に運用する際には、それらに問題がないか考えて導入すべきです。 その点バッチファイルだと大したこともできないし、枯れてるので安心というメリットはあります。 何をしたいのかに依りますが、その辺も考えておくと、あとで楽かもしれません。
guest

回答1

0

ベストアンサー

今時バッチファイルで凝ったことをやる必要は無いというか、やらない方が良いと思いますが、バッチファイルは嫌いではないので、回答のようなものをつけておきます。ただし、動くようにするアドバイスのみとし、コードの提示はしませんので悪しからず。

と、その前に。
貼付するコードは、事象説明に沿うものにしてください。貼付されたコードとiniファイルにはversion変数に値は入るような記述はありません。したがってそのまま実行すれば、すべてのiffalseとなるため選択肢は表示されないはずです。実際のバッチファイルではtypeとなっているのではないですか?

それから、選択肢表示前の1秒ウェイトにPowerShellを使っていますが、他の行のようにtimeoutを使わないのはなぜでしょうか。待ちのメッセージが邪魔という理由でここだけ意図的に使っているならば>nulをつけて表示を捨てましょう。今回作成したいものが業務目的などであるならば、バッチファイルを使う理由は、PowerShellを使える状況(環境)ではないということだという理解です。であれば、他の行同様にtimeoutコマンドを使うべきです。

もしPowerShellが使用不可ではないけど、よくわからないからバッチファイルを選ばれているならば、今の理解レベルからバッチファイルを学ぶよりもPowerShellの学習をおすすめします。この程度の処理ならば、バージョン差異は気にするものでもないでしょう。なおvbsもバッチファイルほどではないですが今更感があるのでおすすめしません。(注:vbs大嫌いな個人の見解です)

さて、本題(らしきもの)へ。

  • 選択肢以外の値が入力された時の動作

本当にwelcomeの入力でもループしないのですか?
09の入力ならば、選択肢(iniファイルのデータ)の有無にかかわらず、何れかのiftrueになるため、ループしないのは当然ですが、そうでない入力ならばループするはずです。

  • forでの変数代入のロジック

正直、理解度が低いときにあのヘルプは理解しにくいとは思うので、このコード前提での解説をしておきます。
/fオプションは、後続の()内ので指定したファイル内容の1行毎にループすることの指定。
delims==は、(2文字目の)=を1行の中でのデータ列の区切り文字とする。
tokens=1,*は、区切られたデータの一つ目を、一つ目の変数へ、残りのすべてを二つ目の変数へ代入。
%%aは取得したデータを代入する一つ目の変数名。二つ目以降の指定をしていない(出来ない)が%%bを使用。

投稿2019/02/25 16:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/03/01 09:21

回答ありがとうございます。 バッチファイル以外の別の事にチャレンジしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問