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

こんばんは。
初めて掲載します。

バッチファイルで、複数のあるファイルの中身の特定の文字列を一括編集したと思っているのですが、どのようにコマンドを組めばいいのでしょうか?
コマンド、バッチは初めてなのでどのように組めばいいのか是非ともご教授願います。


例として、バッチを実行すると、
C:\temp\の下にtest1.xmlとtest2.xmlがあります。
バッチファイルを実行すると、その2つのファイルの中身のある特定の文字を編集("AAA"という文字列を"BBB"に)して保存する。
というような処理を行いたいです。

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

A 回答 (3件)

バッチファイルで文字列置換処理は出来ますが、処理対象に特殊記号が入っていると取り扱いが難しいです。

XMLだと " や ! などがあると思うので、無理っぽいです。

Windows標準搭載のVBScriptを使うと良いでしょう。

Set Re = New RegExp
Re.Pattern = "AAA"
Do While Not WScript.StdIn.AtEndOfStream
str = WScript.StdIn.ReadLine
WScript.StdOut.WriteLine Re.Replace(str,"BBB")
Loop

という内容のファイル aaabbb.vbs を作って、
cscript //nologo aaabbb.vbs <test1.xml >test1.xml.output
で変換できます。

置換元パターンは正規表現なので、記号を含む文字列を指定したい場合はクォートが必要です。
    • good
    • 0
この回答へのお礼

notnotさん、ご回答ありがとうございます。

VBScriptですか。
試してみます。

ありがとうございました!

お礼日時:2007/07/31 20:37

> Active Perlを使う部分をJavaを使ってという風にはできないでしょうか?


たぶんできると思うけど、Javaは分かりません。Javaカテゴリで再度質問してみては。
    • good
    • 0
この回答へのお礼

了解です。
ありがとうございました!

お礼日時:2007/07/31 20:36

OS標準のバッチの仕組みでだけは不可能。

文字列置き換えの部分は何らかのツールを使う必要があります。

私がよくやるのはActive Perlをインストールして、バッチに以下の一文を入れる方法です。

perl -i.bak -p -e 's/AAA/BBB/g' test1.xml

perlコマンドを使い、test1.xmlの中の文字列AAAをBBBに置き換え、元のファイルを拡張子bakにして保存しておく
という意味です。
    • good
    • 0
この回答へのお礼

x1vaさん、ご回答ありがとうございます。

ツールが必要ですか・・・。
企業のシステム開発なので必要なアプリ以外はインストールできない決まりなので無理っぽいですね(>_<)
Javaで開発しているのですが、Active Perlを使う部分をJavaを使ってという風にはできないでしょうか?

お礼日時:2007/07/30 09:31

このQ&Aに関連する人気のQ&A

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

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

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

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

QDOSコマンドラインからxmlファイル整形したい

こんにちは。

Windows のコマンドライン(正確にはバッチファイルで)、指定した xml ファイルを整形する方法を探しています。

整形方法は適当でよいですし、検証機能はなくても構いません(あっても別にいいです)。
現状、XMLがまったくの改行なしでベタ打ちされているので、多少は整形しないと、というレベルです。後々のファイル処理がややこしくならないように。

簡単に準備できるもの、コマンドもシンプルで、オプションなども複雑でないものがいいのですが、なにかいいプログラムなどご存じでしたら教えてください。XMLファイルは最大で10MBくらいあるかもしれません。

Aベストアンサー

定番ですが HTML Tidy とか。名前は HTML だけど XML にも対応してます。

実行してみましょう。これが元のファイルの sample.xml。改行無し。

 <?xml version="1.0" encoding="utf-8" ?><friends><person><name>松田松男</name><nickname>まっちゃん</nickname><tel>0123-45-6789</tel></person><person><name>高野高雄</name><nickname>タカさん</nickname><tel>9876-54-3210</tel></person></friends>

tidy で整形するとこんな感じ。

 $ tidy -utf8 -xml -i -q sample.xml
 <?xml version="1.0" encoding="utf-8"?>
 <friends>
 <person>
 <name>松田松男</name>
 <nickname>まっちゃん</nickname>
 <tel>0123-45-6789</tel>
 </person>
 <person>
 <name>高野高雄</name>
 <nickname>タカさん</nickname>
 <tel>9876-54-3210</tel>
 </person>
 </friends>

これは Linux で実行したけど、Windows 版もあります。

説明は次のページがわかりやすいかな。

http://d.hatena.ne.jp/takuya_1st/20110830/1314704820

下のページが本家。

http://tidy.sourceforge.net/

定番ですが HTML Tidy とか。名前は HTML だけど XML にも対応してます。

実行してみましょう。これが元のファイルの sample.xml。改行無し。

 <?xml version="1.0" encoding="utf-8" ?><friends><person><name>松田松男</name><nickname>まっちゃん</nickname><tel>0123-45-6789</tel></person><person><name>高野高雄</name><nickname>タカさん</nickname><tel>9876-54-3210</tel></person></friends>

tidy で整形するとこんな感じ。

 $ tidy -utf8 -xml -i -q sample.xml
 <?xml version="1.0" encoding...続きを読む

QVBSでxmlの値を書き換えたい

お世話になります。
VBScriptで作成しています。

A.xmlの「sx」の値を全て200にしたいと思っております。
A.xmlの値を抜き取って、OKフォルダに複製する処理は
作ったのですが、どのようにして、sxを指定・その中の値を
変更するのかわかりません。

お手数ですが、ご教授お願いいたします。

------------------A.xml----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<links>
<link id="0" name="" title="">
<sx>145</sx>
<sy>142</sy>
</link>
<link id="1" name="" title="">
<sx>495</sx>
<sy>142</sy>
</link>
<link id="2" name="" title="">
<sx>155</sx>
<sy>510</sy>
</link>
</links>

---------------------------------------------------
------スクリプト------------------------------------------------
Set Fso = CreateObject("Scripting.FileSystemObject")
Set objXML = CreateObject("Msxml2.DOMDocument.3.0")

' カレントディレクトリ
str = WScript.ScriptFullName
Set obj = Fso.GetFile( str )
Set obj = obj.ParentFolder
str = obj.Path

' XML を読み込み
objXML.load( str & "\A.xml" )

**********************************************************
'''ここで、sxの属性の値を変更したい
**********************************************************

' XML を保存
objXML.save( str & "\OK\A.xml" )
------------------------------------------------------

お世話になります。
VBScriptで作成しています。

A.xmlの「sx」の値を全て200にしたいと思っております。
A.xmlの値を抜き取って、OKフォルダに複製する処理は
作ったのですが、どのようにして、sxを指定・その中の値を
変更するのかわかりません。

お手数ですが、ご教授お願いいたします。

------------------A.xml----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<links>
<link id="0" name="" title="">
<sx>145</sx>
<sy>142</sy>
</link>
<link id="1" name="" title...続きを読む

Aベストアンサー

SelectNodesを使って抽出を行えば いいと思いますよ

dim objList, objNode

Set objList = objXml.SelectNodes("//links/link/sx")
for each objNode in objList
  objNode.Text = "200"
next

といった具合です

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...続きを読む

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

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

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

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

Aベストアンサー

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

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

区別するなら、

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

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

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

例:
test.txt
abcacbacbacbacbacbacbacbacb

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

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

Aベストアンサー

これですね。

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

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つ...続きを読む

Qxmlファイル内の文字列置換

エクセルマクロ(VBA)で、xmlファイルを自動生成するツールを作成しようとしています。
やりたいことは、「テンプレートとなるxmlファイルを用意しておき、そのxmlファイルに記述してある特定の文字列を、エクセルで記入したデータで置換する」です。

似たようなマクロを作成された経験のある方いらっしゃいましたら、置換するために行う手順、及び必要な関数等を教えていただけますでしょうか。

何卒よろしくお願いいたします。

Aベストアンサー

#1です。DOMの自習を致しました。
MSXMLを使用したい場合、xmlsdk30.chmをダウンロードして、サンプルコードを眺めるのが良いと思います。VB & MSXMLの書籍も探しましたが、既に絶版になっているものが殆どで、Java Script用の書籍で我慢しました。
http://www.microsoft.com/downloads/details.aspx?FamilyID=b432cd45-b7ed-4c32-a443-ec56f10ee175&displaylang=en
もっと新しいバージョンのヘルプがあるかもしれませんが...
DOM/How Do I?/Program with DOM in Visual Basic
の中にある、stocks.xmlというファイルに対して、
<portfolio xmlns:dt="urn:schemas-microsoft-com:datatypes">
中略
<stock exchange="nyse">
<name>zacx corp</name>
<symbol>ZCXM</symbol>
<price dt:dt="number">28.875</price>
</stock>
</portfolio>

同じく、Query XML DOM Nodes (Visual Basic) を改造した、下記の様なコードで置換可能でした(zacx corp -> microsoft corp)
'MSXML3に参照設定
Private Sub test()
Dim oXMLDom As New DOMDocument30
oXMLDom.async = False
oXMLDom.validateOnParse = False
oXMLDom.resolveExternals = False
oXMLDom.preserveWhiteSpace = True
Dim oNode As IXMLDOMNode

If oXMLDom.Load(ThisWorkbook.Path + "\stocks.xml") = False Then
MsgBox "Failed to load xml data from file."
Exit Sub
End If
Set oNode = oXMLDom.selectSingleNode("//stock/name[.='zacx corp']")
If oNode Is Nothing Then
MsgBox "みつかりませんでした"
Exit Sub
Else
oNode.Text = "microsoft corp"
oXMLDom.Save ThisWorkbook.Path + "\saved.xml"
End If
End Sub
(以上、Copyright Microsoft)

#1です。DOMの自習を致しました。
MSXMLを使用したい場合、xmlsdk30.chmをダウンロードして、サンプルコードを眺めるのが良いと思います。VB & MSXMLの書籍も探しましたが、既に絶版になっているものが殆どで、Java Script用の書籍で我慢しました。
http://www.microsoft.com/downloads/details.aspx?FamilyID=b432cd45-b7ed-4c32-a443-ec56f10ee175&displaylang=en
もっと新しいバージョンのヘルプがあるかもしれませんが...
DOM/How Do I?/Program with DOM in Visual Basic
の中にある、stocks.xmlという...続きを読む

Qバッチファイルでテキストファイルの1行目だけ変更

こんばんは

あと少しですばらしい自動化バッチが完成するところなんですが、1点だけできなくて困っているところがあります。

バッチファイルと同じディレクトリにある index.xml の一行目は次のようになっています。
C:\folder\folder\file\hoge.ttxt<?xml version="1.0"?>

すべて1行目です。同じ論理行です。
本来、<?xml version="1.0"?>で始まらなければならない xml ファイルが、いろいろな処理の都合上、冒頭にファイルパスが紛れ込んでしまっているのです。前工程の処理は私の手を出せる範囲ではなく、この状態からスタートしなければなりません。

このファイルの1行目から冒頭のファイルパスの部分を削除したいと思っています。
パスは毎回違うので、1行目すべてを「<?xml version="1.0"?>」で置き換える、という動作にすれば確実だと思います。

具体的なやり方を教えてください。
xml ファイルは大きいときで 7MB くらいあります。UTF-8で保存しています。

Aベストアンサー

回答遅れてすみません。
ifの処理がうまくいかないとのことなので、for処理を見たら、
読み飛ばし機能がついていました。これでどうでしょうか?

cpch 65001
echo ^<?xml version="1.0"?^> >>test.txt
for /f "skip=1 delims=" %%line in ( index.xml ) do (
echo %%line >>test.txt
)

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。

QDOSコマンドで、標準出力を出力しないようにするには?

Windowsのバッチファイルでコマンドを実行する際、標準出力をディスプレイに表示したくないのですが、どのようにするのが、一般的なのでしょうか?
CDで実行するので、ファイルに出力はしたくありません。
UNIXとかだと、nullにパイプするようなのですが…。

Aベストアンサー

>UNIXとかだと、nullにパイプするようなのですが…。

リダイレクトですね。

同様です。
標準出力だけなら「c:\> command > nul」
エラー出力もなら「c:\> command > nul 2>&1」


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

人気Q&Aランキング