在Windows环境中编辑文件夹白名单中的文件

时间:2012-12-17 20:49:57

标签: windows powershell batch-file vbscript

我有一个包含~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   

我的变量上述文件夹结构的文件夹列表如下:

  • Folder1中
  • Folder3
  • FolderC

我的变量是:

  • 搜索:Variable1 = TOMATO
  • 替换为:Variable1 = Lettuce

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

2 个答案:

答案 0 :(得分:0)

计划(独立于实施语言):

  1. 打开白名单文件以供阅读
  2. 对于每个非空行,构建.ini文件的完整/完整文件规范
  3. 如果.ini文件存在,请将其加载到内存中,进行替换并将其写回
  4. 如果您需要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
    

答案 1 :(得分: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