プロが教えるわが家の防犯対策術!

急遽、仕事でバッチファイルを作成する必要がでてきました。
処理はそれほど複雑ではないのですが、コマンドプロンプトについてはまるっきりの初心者でして、困っております。
本来ならば、質問する場合でも基本的な事から調べて部分的に尋ねるべきなのですが、どうしても緊急で必要になるため恥ずかしながら投稿させていただきました。
コードの書き方・例について、皆様お知恵を貸してください。

求めているのは以下の処理です。

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件)

#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
    • good
    • 0

ざっくりとしたバッチファイルのサンプルを作ってみました。


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
    • good
    • 0

ちょっとだけ訂正。


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
'--------------------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/02 23:11

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
'--------------------------------------------------------------
となります。入力文字のチェックもやってます。
    • good
    • 0

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ファイルの領分ではなくなりますね。汗;。
    • good
    • 0

外部コマンドの中に、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

たぶん上記のような感じになるとおもいます。どうでしょう。。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/06/02 23:14

「bat(バッチ)ファイル」って、MS-DOSやWindowsで使われるコマンド逐次実行なんかに使われる*.BATのバッチファイルのみしか使えないという意味ですか。

もしかしてOSがMS-DOSだったりして...
それとも、コマンドプロンプトから出来ればなんでもよいのですか?
せめて、使うのOSぐらい書いて下さい
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!