繁体   English   中英

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

[英]Edit files on folder whitelist in Windows environment

我有一个文件夹,里面有〜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
  • 资料夹

我的变量是:

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

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

计划(与实现语言无关):

  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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM