質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

2706閲覧

バッチファイルのforを用いた複数ファイル同時置換で置換した文字列のみ反映させたい。

kyosanta

総合スコア15

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2017/12/20 07:08

###前提・実現したいこと
https://teratail.com/questions/105428
前回の質問以後新たな問題が発生しました。
複数ファイルの置換が全文二重記載または置換行しか記載されない問題です。

目標はファイルの置換に際し既存のファイルを置換箇所のみ上書きしたいです。
リダイレクトや、別名で出力など(以下で説明)試してはいますが成功しません。
なんとか、よりシンプルで最短距離な方法はないものでしょうか。

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

###発生している問題・エラーメッセージ

case1: 現状では、conファイルの置換は成功しますが、同じ文章が二重に書かれます。(原因は特定済み。リダイレクトコマンド>>が追記の意味を持つから。)

case2: そこで>>を>に変更しました。

echo !line:ObjectTemplate.unlockLevel 0=ObjectTemplate.unlockLevel 1! > %%a

すると今度は置換した行以外が記入されていません。
case3: 次に、諦めて新規ファイルで書き出し旧ファイルを削除するという方法に切り替えました。
ここで問題は以下のコードの登場するタイミングです。

if exist %%a del %%a

このコードを第二のforの前に置くとcase2の二の舞(置換したい行のみ記載)になります。
また、かと言ってリダイレクトのあとに置くとcase1の二の舞(全文章の二重記載)になります。

###該当のソースコード

bat

1rem カレントディレクトリを取得 2cd %~dp0 3 4rem すべての.conファイルを回す 5for %%a in (*.con) do ( 6 rem 置換のためのおまじない。 7 setlocal ENABLEDELAYEDEXPANSION 8 for /f "delims=" %%b in (%%a) do ( 9 echo ----------%%a---------- 10 set line=%%b 11 echo !line:ObjectTemplate.unlockLevel 0=ObjectTemplate.unlockLevel 1! >> %%a 12 echo ----------end%%a---------- 13 ) 14 endlocal 15 ) 16 17pause

###試したこと
では、出力ファイル名を変えてみたら、、、と試みましたが、ここでも問題が。
このコードは終始ターゲットファイル=.conファイルの特定に参照変数(%%az/AZ)を使っているので以下%%aにどんな値を追記しても、拡張子部分しか変更されません。(出力ファイルが.con.texまたは.con.conファイル)

echo !line:ObjectTemplate.unlockLevel 0=ObjectTemplate.unlockLevel 1! >> %%a(addSomething)

しかし、この方法ならファイルは正しく置換されるのです。
ただ、bat動作後のフォルダがとても汚くなってしまうのが難点で、これでは自動化の意味がありません。
(例)%%a2の場合
aaa.con
aaa.con2
bbb.con
bbb.con2
ccc.con
ccc.con2
この場合以下のコードで全部消えてしまいます。

for %%b in (*.con) do ( del %%b )

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なんかゴチャゴチャ書いてあって何が問題なのかよく分かりませんが、コードを見ると、ファイルの単純な書き換えですよね。

dos

1rem カレントディレクトリを取得 2cd %~dp0 3 4rem すべての.conファイルを回す 5setlocal ENABLEDELAYEDEXPANSION 6for %%a in (*.con) do ( 7 for /f "delims=" %%b in (%%a) do ( 8 echo ----------%%a---------->CON 9 set line=%%b 10 echo !line:ObjectTemplate.unlockLevel 0=ObjectTemplate.unlockLevel 1! 11 echo ----------end%%a---------->CON 12 ) > out.tmp 13 move out.tmp %%a 14) 15 16pause

投稿2017/12/20 11:56

編集2017/12/22 21:47
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyosanta

2017/12/22 15:19

上記の方法では、やはり、置換後の行以外の全ての行が上書きされてしまいます。つまり100行が一行になってしまうんです。
otn

2017/12/22 21:50

それは何かのミスですね。もう一度よくチェックして下さい。
guest

0

ベストアンサー

WindowsならPowershellを使いましょう。

--- ReplaceScript.ps1 --- gci -i *.con|%{(gc -en UTF8 $_)|%{$_ -replace'ObjectTemplate.unlockLevel 0','ObjectTemplate.unlockLevel 1'}|sc -en UTF8 $_} --- Replace.cmd --- cd /D %~dp0 powershell -ExecutionPolicy RemoteSigned -File ReplaceScript.ps1

先頭の「(gc -en UTF8 $_)」を括弧で括っているのがミソです。これによりメモリにファイルが全て読み込まれてから次に渡されるため、最後の書き込みで読み込み中のファイルに書き込んでしまうのを回避できます。

投稿2017/12/20 07:54

編集2017/12/22 13:02
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kyosanta

2017/12/20 09:27

ありがとうございます。 しかし、最近バッチファイルの勉強を始めたばかりでようやくわかってきたところなので今更PowerShellを勉強するのも億劫なのです、、、 せっかくですが、バッチファイル版の回答を待たせてください。 数日待ってそれでも無いようでしたらBAさせてください。
kyosanta

2017/12/22 15:20

どうも、バッチファイルとは相性がよろしくないようです。 もう一度出直してきます。 長々とありがとうございまました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問