1

その中に〜4000個のフォルダーがあるフォルダーがあります。これらの各フォルダーには、編集したい .ini ファイルがあります。.ini ファイル内で文字列を検索し、別の文字列に置き換えたいと考えています。

警告は、フォルダーの特定のリスト、必要に応じてホワイトリストがあることです。ホワイトリストで指定したフォルダー内の .ini ファイルのみを変更し、残りのフォルダーは変更したくありません。

私のプラットフォームは Windows です。

フォルダ構造の例:

Parent Folder
    Folder1
        file.ini
            Variable1=TOMATO
            ^^^^^^^^^^^^^^^^^ > Replace with: Variable1=Lettuce    
    Folder2
        file.ini
            DO NOTHING 
    Folder3
        file.ini
            Variable1=TOMATO
            ^^^^^^^^^^^^^^^^^ > Replace with: Variable1=Lettuce    
    FolderA
        file.ini
            DO NOTHING 
    FolderB
        file.ini
            DO NOTHING 
    FolderC
        file.ini
            Variable1=TOMATO
            ^^^^^^^^^^^^^^^^^ > Replace with: Variable1=Lettuce   

上記のフォルダー構造の変数フォルダー リストは次のようになります。

  • フォルダ1
  • フォルダー3
  • フォルダC

私の変数は次のようになります。

  • 検索: Variable1=トマト
  • 置き換え: Variable1=レタス

WinGrepなどを使用しようとしましたが、上記のようにフォルダーのリストを呼び出すことができるのに対して、1行の除外しか見られませんでした。この 1 回限りのスクリプトを本番環境で実行すると、4000 個までのリストから 1000 個までのフォルダーが取り出されるため、手動のプロセスは不可能です。

4

2 に答える 2

0

これを Powershell ソリューションとして提出します。すべてのファイルに静的な「前」と「後」の文字列が必要です。そうでない場合は、ハッシュテーブルを使用して値を格納する必要がある場合があります。ご覧のとおり、ホワイトリストには 1 行に 1 つのパスが必要であり、パスは絶対パス (例: C:\windows) です。

$before = "this string is getting replaced"
$after = "this is my replacement"
$whitelist = [array](Get-content "path\to\whitelist")

foreach ($path in $whitelist) {
    $files = Get-ChildItem *.ini -Path $path -Recurse
    foreach ($file in $files) {
        (Get-Content $file.fullname).Replace($before,$after) | set-content $file.fullname
    }
}

Whitelist.txt サンプル:

C:\test\whats up
C:\test\1
C:\test\2
于 2012-12-17T21:41:56.307 に答える
0

計画 (実装言語に依存しない):

  1. 読み取り用にホワイトリスト ファイルを開きます
  2. 空でない行ごとに、.ini ファイルの完全なファイル仕様を作成します。
  3. .ini ファイルが存在する場合は、それをメモリにロードし、置換を行い、書き戻します。

VBScript バージョンが必要な場合は、.ini ファイルと置き換えに関する詳細を投稿してください。

アップデート:

開始するための VBScript コード:

  Const csFrom = "Variable1=TOMATO"
  Const csTo = "Variable1=Lettuce"
  Dim oFS  : Set oFS  = CreateObject("Scripting.FileSystemObject")
  Dim sDir : sDir     = oFS.GetAbsolutePathName("..\test\13921972")
  Dim tsFL : Set tsFL = oFS.OpenTextFile(oFS.BuildPath(sDir, "whitelist.txt"))
  Do Until tsFL.AtEndOfStream
     Dim sFSpec : sFSpec = Trim(tsFL.ReadLine())
     If "" <> sFSpec Then
        WScript.Echo "wl:", sFSpec
        sFSpec = oFS.BuildPath(sDir, oFS.BuildPath(sFSpec, "some.ini"))
        WScript.Echo "fs:", sFSpec
        If oFS.FileExists(sFSpec) Then
           Dim sAll : sAll = oFS.OpenTextFile(sFSpec).ReadAll()
           WScript.Echo sAll
           oFS.CreateTextFile(sFSpec, True).Write Replace(sAll, csFrom, csTo)
           WScript.Echo oFS.OpenTextFile(sFSpec).ReadAll()
        End If
     End If
  Loop
  tsFL.Close

2回の実行の出力:

wl: dir1
fs: E:\trials\SoTrials\answers\13415663\test\13921972\dir1\some.ini
Variable0=NoliMeTangere
Variable1=TOMATO
Variable2=NoliMeTangere

Variable0=NoliMeTangere
Variable1=Lettuce
Variable2=NoliMeTangere


wl: dir1
fs: E:\trials\SoTrials\answers\13415663\test\13921972\dir1\some.ini
Variable0=NoliMeTangere
Variable1=Lettuce
Variable2=NoliMeTangere

Variable0=NoliMeTangere
Variable1=Lettuce
Variable2=NoliMeTangere
于 2012-12-17T21:31:59.123 に答える