バッチファイルによるテキストの検索と置換


0

私はこの質問が尋ねられるのを見ましたが、私が必要とするもののための適切な答えを決して持っていませんでした

私はコンピュータシステムのリモート技術サポートをして仕事をしています、そして私が頻繁にする必要があることの1つはiniファイルを開いて、新しいものと特定の行を置き換えることです

例として私たちは言うでしょう。

program.ini

プログラム状況=クライアント

それを読むように私はそれをサーバーに変更する必要があるでしょう

プログラム状況=サーバー

はい私はメモ帳でそれを開くことができますが私は私が他のすべてのことのために私が既に作成したバッチツールを持っているので私はバッチファイルのコマンドラインを通してこれを実行できるようにしたいです。

さて、すべてのコンピュータがPowerShellスクリプトをサポートしているわけではないので、これは1つのバッチファイルに含まれている必要があります。これらは私が接続している私のシステムではないので、私は追加のソフトウェアをダウンロードすることはできません。

私は迷っているので、これが純粋にバッチでどのように行われるかを誰もが知っています。 コマンドラインでエディタを開くのではなく、まっすぐに実行すると、その行がiniファイルで変更されます。

任意の入力をありがとう - テラ


編集された行は整理する必要がありますか? VBScriptとcscriptを想定できますか。
harrymc

はい、それは約100行以上の行を持つiniであり、順番に並んでいる必要があります。そして述べたように、それは追加のファイル、インストール、またはダウンロードを含むことはできません。バッチスクリプトの中で純粋なコマンドラインコマンドを探す方法。私はLinux bashにずっと慣れていて、それでもこのことをWindows用に学習しています。間違っている場合は修正してください。しかし、VBScriptやcScriptに追加のファイルは必要ないでしょうか。
Terra Envy

1)コメントに回答するための情報を追加する場合は、をクリックしてください。 編集する 元の質問に追加して、問題に問題の説明に必要なすべての情報が含まれるようにします。それから、最後にある灰色の(S)をクリックしてコメントを削除します。コメントが重なってしまうと、コメントが隠れることがあります。
K7AAY

Windowsにはネイティブの検索テキストと置換コマンドはありません。 2)PowerShell付きのPCの場合は、次のようなコマンドでスクリプトを作成できます。 猫program.ini | %{$<アンダースコア> -replace "プログラムステータス=クライアント"、 "プログラムステータス=サーバー"} (< underscore> wを実際のアンダースコア文字に置き換えます。
K7AAY

3)PowerShellなしのPCの場合は、オープンソースを追加することをお勧めします。 sed &その依存関係 gnuwin32.sourceforge.net/packages/sed.htm 一時ディレクトリに移動して(これによりインストールやレジストリへの変更を回避します)、そのディレクトリでそのタスク用のsedスクリプトを実行してから削除します。あなたがする最後のこととして、その依存関係。 4)代替案はオープンソースのFreeDOSです。 エドリン en.wikipedia.org/wiki/Edlin#Scripts Windows 10 x 64以降で動作します。 x 32以前のWindowsバージョン。それは簡単な検索テキストとスクリプトを置き換えることを可能にします。 sourceforge.net/projects/freedos-edlin/files/latest/download
K7AAY

回答:


2

このバッチファイルには診断情報も含まれています。ループ内で変数を正しく使用するには、setlocal行が必要です。

この方法を使用することの最も重要な副作用は、空白行が削除され(FORでは無視される)、テスト(「新しい値を書き出す」セクションにあります)が非常に具体的であるということです。大文字と小文字を区別しないで/ iを使用したマッチングを実行できますが、質問にスペースを含めるため、それらを含めることをお勧めします。それぞれの可能な比較を再現するためにそのセクションで行われるように複数の行を含める必要があります。

@ECHO OFF
setlocal enableDelayedExpansion

FOR /F "tokens=1,* delims==" %%i IN (test.ini) DO (
    SET sdone=0
    SET "sname=%%i"
    SET "svalue=%%j"
    ECHO.Name:  !sname!
    ECHO.Value: !svalue!

    :: write out headers
    IF "!sdone!"=="0" IF "!sname:~0,1!"=="[" SET sdone=1&&ECHO.Type:  Header&&ECHO.!sname!>>new.ini

    :: write out the new value if it's client
    IF "!sdone!"=="0" IF "!sname!"=="program status" IF "!svalue!"=="client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini
    IF "!sdone!"=="0" IF "!sname!"=="program status " IF "!svalue!"==" client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini

    :: write out anything else
    IF "!sdone!"=="0" SET sdone=1&&ECHO.Type:  Content&&ECHO.!sname!=!svalue!>>new.ini

    :: a little padding to read the debug info
    ECHO.
)

最後に、元のファイルを上書きするための何かを追加したいでしょう。

copy /y new.ini test.ini

INIにスペースがないので、これは実際に必要なときに完全に機能します。あなたの反応に感謝します。
Terra Envy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.