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

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

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


どうか、よろしくお願いします。

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qバッチファイルでユーザーに入力させた値を取得するには?

バッチファイルで処理を行い、処理の途中で
ユーザーに何かコードなどを入力させて
その値を取得して処理を行いたいのですが
そのような方法はありますでしょうか?

どなたか、よろしくお願いします。

Aベストアンサー

OSがWindows 2000/XP なら

echo 前処理
set /P IN=コードを入力してください:
echo 入力されたコードは %IN% です。

というふうに set コマンドで取得できます。

Windows 98/Me ですと標準のコマンドでは無理なので、フリーソフトを使うことになります。BATUTY なんかが有名です。(参考URL)

参考URL:http://www.vector.co.jp/soft/dos/util/se023753.html

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Qbatプログラム上で文字列を入力する方法!!

batファイルの中で文字列を入力するPGMは作れないでしょうか?
例えば、INPUTBOXみたいな感じで自分で文字を入力したいのですが。
よろしくお願いします。

Aベストアンサー

例です
-----------------------------------------------
@echo off
set /p INP="金額を入力してください >"
echo 金額は%INP%と入力されました。
----------------------------------------------

これを実行してみればわかると思います。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qbatファイル処理でのテキストファイルの内容を編集

batファイル処理のみにてテキストファイルの内容を編集する事は可能でしょうか。

例えば
aaa=0
bbb=0
ccc=0
ddd=0

という内容のテキストファイルが存在し、batファイルにて
aaa=0
bbb=1
ccc=1
ddd=0

というように、指定行の内容を変更させたいのですが、この処理をbatファイルのみで行う事は可能でしょうか。

宜しくお願いします。

Aベストアンサー

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
objFile.Close
strText = Replace(strText, "bbb=0", "bbb=1")
strText = Replace(strText, "ccc=0", "ccc=1")

Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.WriteLine strText
objFile.Close
----- replace.vbs ここまで -----

参考URL:http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx

こんな感じですか?
パスは適切に設定してください
----- a.bat -----
cd c:\foo\bar
if exist test.bak goto skip
copy test.ini test.bak
cscript a:\hogehoge\replace.vbs test.ini
:skip
----- a.bat ここまで -----

----- replace.vbs -----
Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
obj...続きを読む

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む

QコマンドプロンプトのERRORLEVELについて!

コマンドプロンプトの記述で、ERRORLEVELというのがありますが
そのERRORLEVELが、0の場合は正常終了と考えていいのでしょうか?

Aベストアンサー

>if not ERRORLEVEL 1 goto aaa
>教えていただいた上記記述なんですが、
>1じゃないということは、2~255も含まれるのではないのでしょうか?
>素朴な疑問ですいません。

if文の文法については、if /? で調べてください。

if ERRORLEVEL 1 goto aaa は、ERRORLEVEL が1以上の時にgoto aaaするという意味です。ということを#4の人が書いてるのですが・・・
従って、その否定である、
if not ERRORLEVEL 1 goto aaa は、ERRORLEVEL が1未満つまり0のときにgoto aaaします(負になることはないので)。

Qバッチファイルでエクセルのマクロを動かしたい

最近になってバッチファイルを知りました。バッチファイルを使ってエクセルファイルの中に書かれたマクロを動かしたいと思っています。
過去ログの検索をし、マクロが書かれたエクセルを起動させるところまではわかりました。
しかしその先がわかりません。わからない内容は次の二つです。
1)エクセル起動時マクロを有効にするかどうか聞いてきます。自動的に有効で起動させるにはどうしたらいいでしょうか。
2)Macro1という名前のものが001.xlsの中に既に作ってあったとして、これを作動させるにはどのようにしたらいいのでしょうか。
環境はwin xp sp2 office2000です。
過去ログを参考にし、下記記述で001.xlsを開くところまではわかりました。この後をどうすればいいか、よろしくお教えください。
"C:\Program Files\Microsoft Office\Office\excel.exe" "c:\My Documents\001.xls"

Aベストアンサー

こんにちは。

Perl 自体は、また別というか、Wscript.Run で呼び出してもよいと思いますが、
WScript でも、Perl の複雑な処理にはかないませんが、正規表現も持っていますから、多少は似たようなマネが出来ます。

バッチプログラムと違うのは、まず、フォルダを探すことが可能だということと、フォルダを選択する、ダイアログが使えるということです。

個別のファイルのファイルの移動なら、

Const myPATH ="C:\My Documents\

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile =objFS.GetFile(myPATH & "Test.txt")
objFile.Move "C:\"

個別のファイルのファイルの削除なら、

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile =objFS.GetFile(myPATH & "Test.txt")
objFile.Delete

----------------------------------------------
ワイルドカードも使うようでしたら、
Const myPATH ="C:\My Documents\


Set objFS = CreateObject("Scripting.FileSystemObject")
objFS.MoveFile myPATH &"*.txt", "C:\"

ですし、ファイルの削除なら、

Set objFS = CreateObject("Scripting.FileSystemObject")
objFS.DeleteFile myPATH &"*.txt"

ということになります。

---------------------------------------------
なお、余談ですがVBAの技術は、今はもう停滞したままですが、総じて、テキスト・スクリプト側は、日進月歩、Win XP になってからは、1年ごとに、まるで違う技術が導入されているのです。歯が立たないかもしれませんが、どんな風になっているかは、知っておいたほうがよいかもしれません。昔は、コンパイラーを使った、実行ファイルしたが、今は、テキスト・スクリプトで、ツールを出しています。それは、Office 2007 も同じですね。そして、今は、スクリプトで、.Net FrameWork まで使ってしまおうというのだから、時代は変わっているのです。(知っている人には、間が抜けた発言ですが。)

参考サイト:
ヘイ! スクリプティング ガイ
http://www.microsoft.com/japan/technet/scriptcenter/learnit.mspx

こんにちは。

Perl 自体は、また別というか、Wscript.Run で呼び出してもよいと思いますが、
WScript でも、Perl の複雑な処理にはかないませんが、正規表現も持っていますから、多少は似たようなマネが出来ます。

バッチプログラムと違うのは、まず、フォルダを探すことが可能だということと、フォルダを選択する、ダイアログが使えるということです。

個別のファイルのファイルの移動なら、

Const myPATH ="C:\My Documents\

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objF...続きを読む

Qバッチファイル 文字列にスペースがある場合

for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\

これはcドライブのa aaというフォルダ名の中を検索するコードですが、
フォルダ名にスペースがあるため、うまく動きません。

"a aa"のように""で囲ってみましたが、駄目でした。

どうすれば良いのか、教えていただきたいので、お願いします。

Aベストアンサー

for /f %%A in ('dir /b /s c:\"a aa"\*.pdf') do echo copy "%%A" D:\
のようにecho でどのようなコマンドが実行されているか確認しましょう。

この記述ではdirコマンドで表示されるパスの中に空白があるため %%A には空白までの文字列しか代入されません。
以下のように修正して試してみてください。

for /f "delims=" %%A in ('dir /b /s c:\"a aa"\*.pdf') do copy "%%A" D:\

Qバッチファイルで2つ以上の変数を連結し、1つの変数にしたい。

Windows2000でバッチファイルを作っています。
バッチファイルが受け取る2つのパラメータを %1 %2とすると、
それを連結して、新たな変数 A を作りたいのですが、どのようにすれば良いのでしょうか。

Aベストアンサー

SETで変数にパラメータをセットすればOKだと思います。

例)
SET A=%1%2
echo %A%


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報