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

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

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バッチファイルで環境変数が設定されません

よろしくお願いいたします。
Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。
command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。

cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。

なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。
アドバイスをよろしくお願いいたします。

@echo off
set foo=word
path=c:\
echo %foo%
echo %path%
上記バッチを実行すると
word
c:\
と表示されますが、set コマンドで確認すると
FOO は存在しません
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;...
と表示されます。 これはバッチ実行前の値です。

よろしくお願いいたします。
Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。
command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。

cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。

なぜ command.com 上のバッチから操作できな...続きを読む

Aベストアンサー

#2です。

> >>あらかじめ起動しておいたcommand.comのプロンプトでバッチファイルを実行すれば期待通りになっているように思えるのですが。
> 私もその様に考えて同様の期待をしてバッチファイルを実行しました。
> しかしバッチ終了後に set コマンドで確認すると、環境変数はまったく変化していないのです。 バッチ実行前の状態なのです。

不思議ですね。
こちらではバッチファイルで変更した環境変数はプロンプトに戻っても変化したままです。
XP Pro SP2なので環境は変わらないと思いますが。

#COMSPEC環境変数でcmd.exeを指定してるとか。

QAccessからバッチ処理を実施し、作成したデータを取り込む処理

お世話になっております。
題名の件ですが、

▼Accessマクロ
Function EventQuery()

Dim objWSH As Object
Set objWSH = CreateObject("WScript.Shell")
objWSH.Run """C:\Documents and Settings\userName\デスクトップ\EventLogAccess\event.bat"""
Set objWSH = Nothing

End Function

上記マクロで、event.batというバッチ処理を実行しております。

▼event.bat
set fname=%DATE:/=%
eventquery /s server /u userName /p passWord /l application /fi "Id eq 8" /fi "Datetime gt 12/04/2009,01:00:00AM" /r 500 /v >%fname%.txt

上記バッチ処理で、2009年12月4日のイベントログ(アプリケーション)の一覧を取得しております。

【質問内容】
eventquery.vbsのオプションでは日付指定しかできないみたいですが、
実行した当日のログ(アプリケーション)を取得したいと考えております。

方法はないでしょうか?
ご教示の程宜しくお願い致します。

お世話になっております。
題名の件ですが、

▼Accessマクロ
Function EventQuery()

Dim objWSH As Object
Set objWSH = CreateObject("WScript.Shell")
objWSH.Run """C:\Documents and Settings\userName\デスクトップ\EventLogAccess\event.bat"""
Set objWSH = Nothing

End Function

上記マクロで、event.batというバッチ処理を実行しております。

▼event.bat
set fname=%DATE:/=%
eventquery /s server /u userName /p passWord /l application /f...続きを読む

Aベストアンサー

>>event.bat の 12/04/2009 の部分をパラメータ %1 に変更して
>▼event.bat
>set fname=%DATE:/=%
>eventquery /s server /u userName /p passWord /l application /fi "Id eq 8" /fi "Datetime gt %1,01:00:00AM" /r 500 /v >%fname%.txt
>
>上記のように変更すると、エラーとなりログの取得ができないです。

この文章からですと、

「Access で 実行する .Run の内容を "~\event.bat" & Format(Date,"mm/dd/yyyy") 」

の部分がされていないのではないか、と思えてしまうのですが・・・。

「Access で 実行する .Run の内容を "~\event.bat" & Format(Date,"mm/dd/yyyy") 」

の内容を理解されているのかいないのかよくわからないのですが、とりあえず、もう一つ、「Access で 実行する .Run の内容を "~\event.bat" & Format(Date,"mm/dd/yyyy") 」にせずにできる方法を考えてみました。
コントロールパネルの「地域と言語のオプション」の日付の設定が
YYYY/MM/DD になっている場合ですと、

set fname=%DATE:/=%
FOR /F "tokens=1-3 delims=/ " %%A in ('DATE /T') do SET YYYY=%%A&SET MM=%%B&SET DD=%%C
eventquery /s server /u userName /p passWord /l application /fi "Id eq 8" /fi "Datetime gt %MM%/%DD%/%YYYY%,01:00:00AM" /r 500 /v >%fname%.txt

のようにすると、%MM%/%DD%/%YYYY% が実行した日付に置き換わります。


>%1の意味を教えていただけないでしょうか。

%1 は1番目のパラメータです。
同様に %2 ~ %9 が使用できます。
例えば、
COPY AAA.TXT %1
という内容の BBB.BAT があったとすると
BBB.BAT CCC.TXT
を実行すると BBB.BAT の中で %1 が CCC.TXT に置き換わり、
COPY AAA.TXT CCC.TXT
が実行されます。

>>event.bat の 12/04/2009 の部分をパラメータ %1 に変更して
>▼event.bat
>set fname=%DATE:/=%
>eventquery /s server /u userName /p passWord /l application /fi "Id eq 8" /fi "Datetime gt %1,01:00:00AM" /r 500 /v >%fname%.txt
>
>上記のように変更すると、エラーとなりログの取得ができないです。

この文章からですと、

「Access で 実行する .Run の内容を "~\event.bat" & Format(Date,"mm/dd/yyyy") 」

の部分がされていないのではないか、と思えてしまうのですが・・・。

「Acc...続きを読む

QMS-DOSのバッチで変数を使いたい

バッチで、変数というものを使えますか?
以下のようなものをイメージしていますが、これに近いソースを教えてもらえないでしょうか?

@ECHO OFF
i=2008
echo "現在は" + i + "年です"

Aベストアンサー

@ECHO OFF
set i=2008
echo 現在は %i% 年です

Q.txtではなく.logの方が良いのでしょうか?

vbaでシステム開発をしていて、テキストファイルにログを書き出そうと思うのですが
その際拡張子は.txtではなく.logの方が良いのでしょうか?

txtとlogは、ファイル名で判断するためだけで中身の機能は同じですか?

Aベストアンサー

> txtとlogは、ファイル名で判断するためだけで中身の機能は同じですか?
中身は .txt も .log もテキストファイルで同じですし、ログを確認する時もファイルを開いて文字を読むというのも同じだと思います。

後々ファイルが増えてきた時に「.logだから開発したシステムが出力したログファイルだし削除してOK」と即判断できる様にもなるので.logにしてみては如何でしょうか?

参考URL:http://www.profaim.jp/rel-tech/datatype/extension.php

Qバッチファイルで変数の内容変更

以下のバッチファイルで,10回目のループで,ファイル名を入力している変数を
「out.txt」と変更したいのですが,変更前の「in.txt」と
出力されてしまいます。
どのように対処すれば宜しいでしょうか?
よろしくお願いします。

@echo off
set FLN=in.txt
for /L %%N in ( 1 , 1 , 10 ) do (
echo %%N
if "%%N" equ "10" (
echo 変更します
set FLN=
set FLN=out.txt
)
echo %FLN%
)
@echo on

Aベストアンサー

「cmd /V:ON」でコマンドウィンドを開き、以下のように修正すれば、意図した動作となると思います。
詳細は、「help set」をご参照ください。

@echo off
set FLN=in.txt
for /L %%N in ( 1 , 1 , 10 ) do (
echo %%N
if "%%N" equ "10" (
echo 変更します
set FLN=
set FLN=out.txt
)
echo !FLN! <---------------------
)
@echo on

Qcat `find ./` > for_print.txt にファイル名を入れたい!

カレントディレクトリ以下のファイルを連結したいのですが、
cat `find ./` > for_print.txt
に「ファイル名」と、
あと、「区切り」がわかるように
********************************
を入れたいのですが、
どうしたら良いでしょうか?

Aベストアンサー

セパレータの形式にこだわらないのであれば、
more `find ./` > for_print.txt
とか、
tail +0 `find ./` > for_print.txt
とか。

Qコマンドプロンプト バッチ|結果を変数に代入する方法

バッチで、外部のEXEを実行した結果を変数に代入する方法を教えてください。

外部のEXEは
hogehoge.exe あいうえお
と実施した場合
おえういあ
という結果を返します。

たとえば…

SET HOGE=hogehoge.exe あいうえお
ECHO %HOGE%

の結果として おえういあ を表示する
という風にしたいです。

Aベストアンサー

Win2000やXPなど NT系のコマンドプロンプトなら
usebackqを使って バッチの変数に代入してやればいいと思いますよ

for /F "usebackq" %%s in (`hogehoge.exe あいうえお`) DO@ SET HOGE=%%s
といった具合で in句の『hogehoge.exe あいうえお』の実行結果が バッチ変数 %%sに代入されます

Qバッチファイル(.bat)へWSH(.wsf)のエラーコードの返し方について

はじめまして、kiwi88と申します。

バッチファイル(.bat)からwshスクリプト(.wsf)を呼び出すプログラムを作成しました。
そこで、wshスクリプトで実行されたエラーコードを呼び出しもとのバッチファイル(.bat)に返すことはできますでしょうか。

以下はバッチファイル(.bat)からwshスクリプト(.wsf)を呼び出す箇所のソースです。

◆バッチファイル(test.bat)◆
----------------------------------------
~※処理内容省略~

cscript test.wsf //nologo //Job:wshscript > batch.log
IF %ERRORLEVEL% NEQ 0 GOTO ERR
exit

:ERR
set ret=%ERRORLEVEL%
echo ****** [%:ERRORLEVEL=%ret%] ****** > err.txt
exit %ret%
----------------------------------------

以下はwshスクリプト(.wsf)のエラーコードを返す箇所のソースです。

◆wshスクリプト(test.wsf)◆
----------------------------------------
<job id = "wshscript">
<script language = "VBScript">
<![CDATA[

Option Explicit

Function Main()

~※処理内容省略~

err = Err.Number
Main = err

End Function

]]>
</script>
</job>
----------------------------------------

長くなってしまい、申し訳ありませんが、
ご教授願えますでしょうか。
宜しくお願いいたします。

はじめまして、kiwi88と申します。

バッチファイル(.bat)からwshスクリプト(.wsf)を呼び出すプログラムを作成しました。
そこで、wshスクリプトで実行されたエラーコードを呼び出しもとのバッチファイル(.bat)に返すことはできますでしょうか。

以下はバッチファイル(.bat)からwshスクリプト(.wsf)を呼び出す箇所のソースです。

◆バッチファイル(test.bat)◆
----------------------------------------
~※処理内容省略~

cscript test.wsf //nologo //Job:wshscript > batch.log
IF %ERRORLEVEL% ...続きを読む

Aベストアンサー

wsf で job で書かれたスクリプトは順番に実行されます。
質問文で書かれたCDATAセクションはこの場合必要有りません。
また、Main 関数が定義されている時自動的にそれが実行されるということもありません。ユーザーが定義した関数を実行するには呼び出す必要があります。
例えば以下のように書きます。
----------------------------------------------------------------
<job id = "wshscript">
<script language = "VBScript">
Option Explicit

Function Main()

'なんかの処理
err = Err.Number
Main = err
End Function
'ここが実行されるメインの処理
WScript.Quit(Main()) '関数Main を呼び出しその返値をjob の返値とする
</script>
</job>

Qバッチファイルへの変数のキー入力、変数名を含むファイルへの出力

とあるヘッダーの作成のため、キー入力した値で、変数名を含む名前のテキストに変数の入ったファイルを書き出そうと思うのですが、どなたかアドバイスいただけますでしょうか。

いまのところ次のような感じで、%num%という変数に数字を入れるようにしたいのですが。
SET/P %num% = 数字を入力してください: 
echo right: %num% >> header%num%.txt
echo leftt: %num% >> header%num%.txt

また、バッチファイルのサンプルが多く載っている書籍等の紹介でもかまいませんどうぞよろしくお願いします。

Aベストアンサー

アドバイスというか・・・

> SET/P %num% = 数字を入力してください: 
これ変では?

> SET/P num= 数字を入力してください: 
なのでは?
#代入時に「%~%」は不要。変数名の後の=との間に空白不要。

QDOSバッチ処理でファイル名の取得

選択した複数のファイルの名称を取得する目的で、以下の内容のバッチファイルを作成し、(右クリック>送る) で使えるようにしています。
選択するファイル名が少なければ問題なく.txtが作成されるのですが、ファイル数が100を超えると(選択したファイルによって上限が変わる).txtが作成されなくなります。
バッチファイルの内容に問題があるのでしょうか?
アドバイスをお願いします。

:start
if "%~1"=="" goto end

dir /b %1 >> %TEMP%\List.txt

shift
goto start

:end

Aベストアンサー

バッチファイルというのは、実際には、cmd.exe というプログラムが処理の主体です。
そして、右クリックで「送る」とした場合、最終的には、 cmd.exe file1 file2 .... という文が生成されて、これが実行されます。

で、cmd.exe が受け取れる文字数には、上限があります。(おそらく、8196文字)

http://support.microsoft.com/kb/830473/ja

で、この文字列を超えると、それ以降のファイル名が切り捨てられてしまうのだろうと思います。


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

人気Q&Aランキング