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

我的变量是:

  • 搜索:变量 1=番茄
  • 替换为:变量 1=生菜

我尝试使用 WinGrep 等,但我只看到一行排除而不是能够调用上述文件夹列表。我对这个一次性脚本的生产运行将从 ~4000 个文件夹中拉出 ~1000 个文件夹,因此无法进行手动处理。

4

2 回答 2

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

两次运行的输出:

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 回答
0

我将把它作为 Powershell 解决方案提交。它需要所有文件的静态“之前”和“之后”字符串。如果不是这种情况,您可能需要使用哈希表来存储值。如您所见,它还要求白名单每行有一个路径,并且路径是绝对的(例如 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 回答