- 締切済み
bat(バッチ)ファイルで文字入力受付・ファイルへ書込み
急遽、仕事でバッチファイルを作成する必要がでてきました。 処理はそれほど複雑ではないのですが、コマンドプロンプトについてはまるっきりの初心者でして、困っております。 本来ならば、質問する場合でも基本的な事から調べて部分的に尋ねるべきなのですが、どうしても緊急で必要になるため恥ずかしながら投稿させていただきました。 コードの書き方・例について、皆様お知恵を貸してください。 求めているのは以下の処理です。 1.半角アルファベット1文字の入力を受け付ける(a~zまたはA~Z) 2.Sample.txtの中を検索し、Input= となっている行を見つける。 3.Input=A_input のように、1.で入力を受け付けたアルファベットをInput=の末に挿入、後に_inputと繋げて表記する。 4.Sample.txtを保存し、バッチ処理終了。 Sample.txtは以下のような具合のファイル ************************* Sample.txt 作者:酸 振男 ************************* Date=0529 Level=help Input= Tel=0120999999 以下続く... Input= の行は、ファイル全体でひとつしかないものとします。 Sample.txtのPathは、C:\age\Sample.txt とします。 可能であれば、アルファベット入力の際に1文字以上入力された場合は、「正しく1文字いれてください」と表記を出して、再入力を促す処理があれば、と思っています。 どうか、よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- pita-gora
- ベストアンサー率70% (102/145)
#6です。 一部記述ミス(Xが抜けてZになっていた)がありましたので訂正します。 echo off :loop set /p in=半角英字1文字(a-z , A-Z) を入力してください: set ans= for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if .%%a.==.%in%. set ans=%%a if defined ans goto OK echo 半角英字1文字(a-z , A-Z) ではないようです。 goto loop :OK for /f "delims=" %%l in (Sample.txt) do ( if .%%l==.Input= echo Input=%ans%_input>>tmp.txt if not .%%l==.Input= echo %%l>>tmp.txt ) ren sample.txt sample.org.txt ren tmp.txt sample.txt
- pita-gora
- ベストアンサー率70% (102/145)
ざっくりとしたバッチファイルのサンプルを作ってみました。 1文字入力するところで特殊な記号 (",| など)を入れるとエラーで終わってしまうという制約がありますが、通常の英字を入れるぶんには動くと思います。 またsample.txtに空行があると無視してしまったり、やはり特殊記号(<や>や|)などがsample.txt にあるような場合はVBSやsedを使われた方がいいでしょう。 echo off :loop set /p in=半角英字1文字(a-z , A-Z) を入力してください: set ans= for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W Z Y Z) do if .%%a.==.%in%. set ans=%%a if defined ans goto OK echo 半角英字1文字(a-z , A-Z) ではないようです。 goto loop :OK for /f "delims=" %%l in (Sample.txt) do ( if .%%l==.Input= echo Input=%ans%_input>>tmp.txt if not .%%l==.Input= echo %%l>>tmp.txt ) ren sample.txt sample.org.txt ren tmp.txt sample.txt
- yyr446
- ベストアンサー率65% (870/1330)
ちょっとだけ訂正。 fileedit.vbsの内容は '-------------------------------------------------------------- Const ForReading = 1 Const ForWriting = 2 Dim objParm Dim objFileSys Dim objInFile Dim objOutFile Dim strFileName Dim strFilePath Dim strRecord Dim strCreateFile DIm parmstr Set objParm = Wscript.Arguments parmstr = objParm(1) If (65 <= Asc(parmstr)) And (Asc(parmstr) <= 90) Or (97 <= Asc(parmstr)) And (Asc(parmstr) <= 122) Then call file_io Else Wscript.Echo "パラメーターが不正です。" end if Sub file_io() On Error Resume Next Set objFileSys = CreateObject("Scripting.FileSystemObject") strFileName = objFileSys.GetFile(objParm(0)).name strFilePath = objFileSys.GetFile(objParm(0)).Path strFilePath = replace(strFilePath,strFileName,"") strCreateFile = objFileSys.BuildPath(strFilePath,"@" & strFileName) objFileSys.CreateTextFile strCreateFile Set objInFile = objFileSys.OpenTextFile(strFilePath & strFileName,ForReading) Set objOutFile = objFileSys.OpenTextFile(strFilePath & "@" & strFileName,ForWriting) If Err.Number=0 Then Do Until objInFile.AtEndOfStream = true strRecord = objInFile.ReadLine strRecord = replace(strRecord,"input=","input=" & parmstr & "_input") objOutFile.WriteLine strRecord Loop objInFile.Close objOutFile.Close objFileSys.DeleteFile strFilePath & strFileName objFileSys.MoveFile strFilePath & "@" & strFileName,strFilePath & strFileName Else Wscript.Echo objParm(0) & "がありませんでした。" end if Set objParm = Nothing Set objFileSys = Nothing Set objInFile = Nothing end Sub '--------------------------------------------------------------
- yyr446
- ベストアンサー率65% (870/1330)
No1、No3の回答者です。 というわけで、もう解決されたかもしれませんが、バッチファイルを 作りました。batファイルのみじゃないからいんちきですが、少なくともWindows2000,WindowsXPのコマンドプロンプトで何も追加インストールしなくても動作しました。(さすがにMS-DOSはだめです。) fileedit.bat C:\age\Sample.txt A として実行出来ます。 fileedit.batの内容は @echo off cscript.exe //Nologo fileedit.vbs %1 %2 だけです。cscript.exeでWSH(VBscript)をバッチ実行します。 fileedit.vbsを別に作っておきます。こちらがメインのプログラムです WSH(VBscript)です。 fileedit.batの内容は '-------------------------------------------------------------- Const ForReading = 1 Const ForWriting = 2 Dim objParm On Error Resume Next Dim objFileSys Dim objInFile Dim objOutFile Dim strFileName Dim strFilePath Dim strRecord Dim strCreateFile DIm parmstr Set objParm = Wscript.Arguments parmstr = objParm(1) If (65 <= Asc(parmstr)) And (Asc(parmstr) <= 90) Or (97 <= Asc(parmstr)) And (Asc(parmstr) <= 122) Then call file_io Else Wscript.Echo "パラメーターが不正です。" end if Sub file_io() Set objFileSys = CreateObject("Scripting.FileSystemObject") strFileName = objFileSys.GetFile(objParm(0)).name strFilePath = objFileSys.GetFile(objParm(0)).Path strFilePath = replace(strFilePath,strFileName,"") strCreateFile = objFileSys.BuildPath(strFilePath,"@" & strFileName) objFileSys.CreateTextFile strCreateFile Set objInFile = objFileSys.OpenTextFile(strFilePath & strFileName,ForReading) Set objOutFile = objFileSys.OpenTextFile(strFilePath & "@" & strFileName,ForWriting) If Err.Number=0 Then Do Until objInFile.AtEndOfStream = true strRecord = objInFile.ReadLine strRecord = replace(strRecord,"input=","input=" & parmstr & "_input") objOutFile.WriteLine strRecord Loop objInFile.Close objOutFile.Close objFileSys.DeleteFile strFilePath & strFileName objFileSys.MoveFile strFilePath & "@" & strFileName,strFilePath & strFileName Else Wscript.Echo objParm(0) & "がありませんでした。" end if Set objParm = Nothing Set objFileSys = Nothing Set objInFile = Nothing end Sub '-------------------------------------------------------------- となります。入力文字のチェックもやってます。
- yyr446
- ベストアンサー率65% (870/1330)
sed はWindows/DOSに無いですね。 懐かしのedlinコマンドならWinXPのcmd.exeにもありました。 edlinをedlin sample.txtで起動して、続けて 標準入力から 1,9999?Rinput=^Zinput=A_input Y E と投入するだけですが、 cmd.exeを操作できる形態で稼動させるのは、WindowScriptingHostの VBSになるから、これをcscript.exeで起動して.... となるとbatファイルの領分ではなくなりますね。汗;。
- Tbug
- ベストアンサー率100% (1/1)
外部コマンドの中に、BATKEYコマンドなどは入っていますか?入っていなければ自作するしかないと思います。 またファイル内の"Input="行を見つけてどうこうするようなコマンドもなかったはずです。 (perl言語やC言語などで上記の処理を書いたらかなり楽なんですがダメですかね??。。汗;) 前者の処理は自前で作り、後者を信頼あるコマンド(例ではsedコマンドを使用)に処理させたとしても、2つの処理間でのデータ渡しのために、アルファベット分の条件分岐(26 x2)が必要になってくるかと思います。以下sample.batの例です。参考にしてください。 --- sample.batの例 --- @echo off :loop input_key.exe REM 上記input_key.exeは自前コマンド REM もしBATKEYがあればそちらを使ってください。 if errorlevel= 1 goto cap_a : if errorlevel=52 goto lit_z if errorlevel=53 goto err :cap_a sed s/^Input=$/Input=A_input/ < sample.txt > sample.tmp goto end :cap_b __中略__ :err echo "正しく1文字いれてください" goto loop :end copy sample.tmp sample.txt del sample.tmp たぶん上記のような感じになるとおもいます。どうでしょう。。
お礼
お返事が遅くなり、大変失礼いたしました。 ご回答、サンプルコードの掲載ありがとうございます。 batファイルだけでは難しいということがわかりました。 他の方の回答で、VBSで作成する案をいただきましたので、そちらに挑戦してみたいと思います。
- yyr446
- ベストアンサー率65% (870/1330)
「bat(バッチ)ファイル」って、MS-DOSやWindowsで使われるコマンド逐次実行なんかに使われる*.BATのバッチファイルのみしか使えないという意味ですか。もしかしてOSがMS-DOSだったりして... それとも、コマンドプロンプトから出来ればなんでもよいのですか? せめて、使うのOSぐらい書いて下さい
お礼
お返事が遅くなり、大変失礼しました。 ご丁寧にソースまで書いてくださいましてありがとうございます! 他件でドタバタしており、本日より製作にとりかかります。 サンプルコードのご提示、非常に助かります。 ありがとうございました。