急遽、仕事でバッチファイルを作成する必要がでてきました。
処理はそれほど複雑ではないのですが、コマンドプロンプトについてはまるっきりの初心者でして、困っております。
本来ならば、質問する場合でも基本的な事から調べて部分的に尋ねるべきなのですが、どうしても緊急で必要になるため恥ずかしながら投稿させていただきました。
コードの書き方・例について、皆様お知恵を貸してください。
求めているのは以下の処理です。
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- その他(プログラミング・Web制作) プログラミング python 3 2023/06/14 03:55
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルのタブをカン...
-
テキストファイルのファイル名...
-
拡張子を元に戻す
-
バッチファイルからVBAに引数を...
-
多数のサブディレクトリ内のフ...
-
VBAでワークシートを引数として...
-
EXCEl/VBAで拡張子なしのファイ...
-
バッチ処理でファイルの中身を...
-
VBAでエクセルをtxtに変換する...
-
DOSコマンドによるテキストファ...
-
ftpコマンドで複数のファイルを...
-
バッチファイルで文字列削除に...
-
.txtではなく.logの方が良いの...
-
複数のファイルデータを新しく...
-
perl ファイル内文字列抽出
-
accessでSQL文を使ってcsvファ...
-
batファイルについて
-
txtファイルが作成されない
-
vbsにてファイルが存在すればメ...
-
cshでファイルサイズ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報