【问题标题】:Edit files on folder whitelist in Windows environment在 Windows 环境中编辑文件夹白名单上的文件
【发布时间】:2012-12-17 20:49:57
【问题描述】:

我有一个文件夹,里面有大约 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=TOMATO
  • 替换为:Variable1=Lettuce

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

【问题讨论】:

  • cygwin?你有什么脚本环境可用?
  • 我考虑过 cygwin,我只是不清楚如何根据我的文件夹列表进行搜索,而不是我正在搜索的文件夹的子文件夹中的模式。它是 Windows,所以任何东西都会脚本必须是 .bat、.vbs、PowerShell 或已安装才能启用其他功能。
  • 您的问题标题和标签具有误导性,我现在已修复它们,因此您应该引起正确专家的注意。您应该提供一些更有用的信息,例如白名单文件中的几行和发布您迄今为止尝试过的内容。

标签: windows powershell batch-file vbscript


【解决方案1】:

一个计划(独立于实现语言):

  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

【讨论】:

  • 这对我来说很完美。第一次来这里,感谢您的精彩体验。
【解决方案2】:

我会将其作为 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

【讨论】:

  • 这个解决方案看起来很完美,但执行时出现错误: * Get-ChildItem : 找不到与参数名称“文件”匹配的参数。在 C:\Test\whitelist.ps1:6 char:51 * Get-Content :无法将参数绑定到参数“路径”,因为它为空。在 C:\Test\whitelist.ps1:8 char:21
  • -File 可能是 PS3.0 的参数,所以略过。 *.ini 本身就足够了。至于路径错误。你的白名单文件内容如何?
  • 顺便说一句,作为新手不知道如何处理这种情况。两个很好的解决方案?我觉得我可以让它工作,而且 Powershell 很优雅,但我对 VBS 更熟悉一点,所以让我运行起来更快。想法?
  • 如果您更熟悉它,请使用它。 :) 修复解决方案,并再次测试。在这里工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多