• 締切済み

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文字いれてください」と表記を出して、再入力を促す処理があれば、と思っています。 どうか、よろしくお願いします。

みんなの回答

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.7

#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)
回答No.6

ざっくりとしたバッチファイルのサンプルを作ってみました。 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)
回答No.5

ちょっとだけ訂正。 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 '--------------------------------------------------------------

MossFran
質問者

お礼

お返事が遅くなり、大変失礼しました。 ご丁寧にソースまで書いてくださいましてありがとうございます! 他件でドタバタしており、本日より製作にとりかかります。 サンプルコードのご提示、非常に助かります。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

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)
回答No.3

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)
回答No.2

外部コマンドの中に、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 たぶん上記のような感じになるとおもいます。どうでしょう。。

MossFran
質問者

お礼

お返事が遅くなり、大変失礼いたしました。 ご回答、サンプルコードの掲載ありがとうございます。 batファイルだけでは難しいということがわかりました。 他の方の回答で、VBSで作成する案をいただきましたので、そちらに挑戦してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

「bat(バッチ)ファイル」って、MS-DOSやWindowsで使われるコマンド逐次実行なんかに使われる*.BATのバッチファイルのみしか使えないという意味ですか。もしかしてOSがMS-DOSだったりして... それとも、コマンドプロンプトから出来ればなんでもよいのですか? せめて、使うのOSぐらい書いて下さい

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バッチ(bat)の作り方を教えてください

    今、特定フォルダ内にあるファイル3つが存在すればコマンドを実行し、無ければ4時までループさせるといったことをバッチでしたいと考えております。 イメージは以下の通りです。 D:\a.txt,D:\b.txt,D:\c.txt バッチを1時から動かして、上記3つが揃えば、そこからコマンドを実行しバッチは終了 もしなければ10分置きにファイルをチェックし、4時を過ぎればバッチを終了(コマンドを実行させない)ということをしたいです。 コマンドは何でも良いので例えば「echo HELLO」とでもしておきます。 よろしくお願いいたします。

  • バッチファイルについて

    バッチファイルについて バッチファイルの勉強をしておりますが、以下のバッチで 分からない箇所があります。 @echo off copy C:\bin\set.txt set.txt | find /v "コピー" echo ユーザー名を入力してください echo 入力後、Ctrlキーを押しながらZキーを押した後、Enterキー copy con inp.txt | find /v "コピー" copy set.txt+inp.txt setinp.bat | find "○○" call setinp.bat echo ユーザー名は%INP%と入力されました! del setinp.bat set.txt inp.txt <<不明箇所>> まず、C:\bin\set.txt』は set INP= とだけ書いたファイルです。 copy C:\bin\set.txt set.txt | find /v "コピー" ですが、|find /v"コピー"はなんのためにやっているのでしょうか?? find /vを調べてみると、指定した文字列を含まない行の内容をすべて画面に表示します。 と記載されていますが・・・・このバッチでは一体なぜ最初にいるのでしょう?? copy con inp.txt | find /v "コピー" ですが、コンソールから入力させた文字列をinp.txtに保存しているらしいのですが、 そのあとに、また、|find /v"コピー"がでてきますが、なぜでしょう??なにを したいのでしょう?? さらにまた、copy set.txt+inp.txt setinp.bat | find "○○"が出てきますが、 ここでなぜまた意味不明な、|find"○○"がでてくるのでしょう?? さらにさらに、バッチを実行してみると、set.txtの中身にはコンソールから 入力した文字は何も記載されていない、そして、inp.txtやsetinp.txtという テキストファイルも、どのフォルダにも出来ていません。 最後の行のdel setinp.bat set.txt inp.txtを消して実行してみても同じです。 なぜでしょう?? このバッチの動き、例としての意図が全く分かりません。。。。 この例題が悪すぎるのか、私の頭がわるすぎるのか・・・・ ちなみに、上記バッチは、http://www.geocities.co.jp/SiliconValley-SanJose/1227/batinput.html のサイトのものです。 どなたかご教授願います。。。一週間悩みましたが、まったく理解できない状態です。。。

  • 複数のファイルに同じ文字列を自動入力するバッチ

    複数のテキストファイルに同じ文字列を入力して保存するバッチを作成したいです。 テキストファイル1.txt テキストファイル2.txt テキストファイル3.txt 上記3つのテキストファイルがあったとしてバッチを起動すると 同じ文字列のデータを自動的に入力したい。 自動入力する文字列:あいうえお そもそも実現可能なのかもよくわかっていませんが ご教示いただけますと幸いです。

  • バッチファイルについて

    バッチファイルから.txtを読み込んで.txtを何行目からスタートさせる事はできるのでしょうか?? 作業としては aaa.txtの三行目を読み込んで test.txtを処理して aaa.txtの終点にくれば作業終了 と言う感じなのですが。 どなたか詳しい方教えてください。 宜しくお願いします。

  • DOSプロンプトでリダイレクションでファイルから入力した文字を表示したい

    標準入力から入力があるプログラムをDOSバッチでテストする為、 入力文字をファイルにしてリダイレクションで入力させています。 入力はされてそれなりに動くのですが、標準出力には入力させている文字列が表示されません。 具体的には、例えばprog.exeというプログラム内で、 printf("Input A =") ; gets(strA) ; printf("Input B =") ; gets(strB) ; となっていて、 入力用のテキストファイル(input.txt)に 1 2 と書込んで、 prog < input.txt とすると、 Input A =Input B= と表示されます。(strA,strBには各々1,2が入っています) テスト結果のログとしてできれば、人が入力する時と同様に Input A = 1 Input B = 2 と表示させたいのですが、何か方法がありますでしょうか? よろしくお願い致します。

  • テキストファイル内の指定文字が含まれる行以下を削除

    いつもお世話になります。 以下、バッチ(bat)で可能でしょうか? テキストファイル内(sample.txt)に指定文字(SA2:という文字)が必ず1行含まれていて 2行以上にはなりません。 SA2が含まれる行以下を削除し、sample1.txtという名前で保存したいです。 findstr SA2 でSA2が含まれる行を調べられるのいですが、その行を含む以下の行を 削除するというのが、どのように考えたらいいのかわかりません。 お力添え頂けますでしょうか? 宜しくお願い致します。

  • バッチファイルで

    バッチファイルでファイル名をキーボードで変更するのは どうすればよいのでしょうか 例:A.txtと言うファイル名をキーボードから2006data.txtにしたいのですが REN C:\A.txt 2006data.txt はわかるのですが2006.txtを変数にして その変数をキーボードで入力する方法(今更バッチファイルでもないのですが?) よろしくお願いします。

  • PhotoshopCS4 写真に文字を入れるバッチ処理

    フォトショップCS4でバッチ処理をしています。 Aというフォルダに約3000枚jpegの写真があるのですが これらの写真全てに「sample」という文字を入れなくてはなりません。 そのAフォルダの写真にsampleという文字を入れたらBというフォルダに保存したいのです。 そこでバッチ処理をしようと思ったのですが、なかなかうまくいきません。どなたかお教え下さい。 現在の方法はアクションから新規アクションを選択。 開くコマンドからAフォルダを選択して1番目の写真Qを出します。 その写真に、もともとフォトショップ上に出してあった 写真Zにsampleという文字があるので、そのZを選択して sampleレイヤーをQにドラッグします。 その後別名で保存を選びBフォルダへjpegで保存します。 以上で記録を中止しまして、その後ファイル→自動処理→バッチを選択し必要事項を記入後バッチスタートなのですが、まずsampleという文字が入っていません。しかもバッチの最後に保存しますか? 聞いてくるため、enterキーを押さなくてはいけない為、結局PCから 離れられないということになります。 すいませんがよろしくお願い致します。

  • DOSバッチファイルで日々ファイル名が変動するファイルの存在チェック

    こんにちは。 フォルダにあるファイルが存在するときに処理を行うバッチファイルを作成しています。 あるファイル名は一部は固定文字で一部は変動します。 具体的には sampleYYMMDD.txt となり、YYMMDDは変動し、その内容は他のファイルdate.txtに入っています。 例えば、date.txtには 041021 がはいっていて バッチファイルでsample041021.txtがあれば次の処理を行うといったロジックを記述したいのですが、どうしたらできますでしょうか? ファイル名が固定であれば単純に FOR %%F DO IF %%F==sample041021.txt 処理 とできそうなのですが、ファイル名の情報はdate.txtの内容に依存します。 もっと簡単なやり方でもかまいません。ヒントをいただけないでしょうか?

  • batでテキストファイル内の文字を使ってリネーム

    テキストファイル内の名前を使ってファイル名をリネーム+番号を付与するバッチファイルを作成したいです。 テキスト内は 1234567-0001.txt 1234567-0002.txt 1234567-0003.txt と書かれていて、 ファイルは 00000001.txt 00000002.txt 00000003.txt とあります。 これを 1234567-0001-1.txt 1234567-0002-1.txt 1234567-0003-1.txt という名前にリネームしたいです。 ファイル自体は1万ファイル以上あるのでバッチファイルで処理したいと思っています。