急遽、仕事でバッチファイルを作成する必要がでてきました。
処理はそれほど複雑ではないのですが、コマンドプロンプトについてはまるっきりの初心者でして、困っております。
本来ならば、質問する場合でも基本的な事から調べて部分的に尋ねるべきなのですが、どうしても緊急で必要になるため恥ずかしながら投稿させていただきました。
コードの書き方・例について、皆様お知恵を貸してください。
求めているのは以下の処理です。
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文字いれてください」と表記を出して、再入力を促す処理があれば、と思っています。
どうか、よろしくお願いします。
A 回答 (7件)
- 最新から表示
- 回答順に表示
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
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
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
'--------------------------------------------------------------
お返事が遅くなり、大変失礼しました。
ご丁寧にソースまで書いてくださいましてありがとうございます!
他件でドタバタしており、本日より製作にとりかかります。
サンプルコードのご提示、非常に助かります。
ありがとうございました。
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
'--------------------------------------------------------------
となります。入力文字のチェックもやってます。
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ファイルの領分ではなくなりますね。汗;。
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
たぶん上記のような感じになるとおもいます。どうでしょう。。
お返事が遅くなり、大変失礼いたしました。
ご回答、サンプルコードの掲載ありがとうございます。
batファイルだけでは難しいということがわかりました。
他の方の回答で、VBSで作成する案をいただきましたので、そちらに挑戦してみたいと思います。
No.1
- 回答日時:
「bat(バッチ)ファイル」って、MS-DOSやWindowsで使われるコマンド逐次実行なんかに使われる*.BATのバッチファイルのみしか使えないという意味ですか。
もしかしてOSがMS-DOSだったりして...それとも、コマンドプロンプトから出来ればなんでもよいのですか?
せめて、使うのOSぐらい書いて下さい
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.txtではなく.logの方が良いの...
-
バッチ処理でファイルの中身を...
-
多数のサブディレクトリ内のフ...
-
拡張子を元に戻す
-
VBAでワークシートを引数として...
-
unlinkで削除されないのは?
-
バッチ処理でリスト行表示空白...
-
外部exeに対しての引数受け渡し
-
Windowsのバッチファイルを利用...
-
COPYコマンドで結合すると余計...
-
コマンドプロンプトで指定した...
-
UWSCでテキストファイルを開い...
-
バッチファイルからVBAに引数を...
-
VBScriptでファイルのコピーが...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
ファイルの最後に文字列挿入
-
C言語、ファイルの存在チェック...
-
ファイル内容の修正、行削除に...
-
accessでSQL文を使ってcsvファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
拡張子を元に戻す
-
テキストファイルで提出とは?
-
ファイルの最後に文字列挿入
-
バッチファイル 複数ファイル...
-
バッチファイルで文字列削除に...
-
renameコマンドについて
-
forfilesで検索したファイルを...
-
accessでSQL文を使ってcsvファ...
-
バッチファイルからVBAに引数を...
-
psqlでエラーログをとりたい
-
UWSCでテキストファイルを開い...
-
cshでファイルサイズ取得
-
MS-DOSのバッチファイルの中で...
-
コマンドプロンプトで指定した...
-
テキストファイルのタブをカン...
おすすめ情報