我有一个包含~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
我的变量上述文件夹结构的文件夹列表如下:
我的变量是:
我尝试使用WinGrep等,但我只看到一行排除而不能像上面那样调用文件夹列表。我的这个一次性脚本的生产运行将从~4000的列表中拉出~1000个文件夹,因此无法进行手动处理。
答案 0 :(得分:0)
计划(独立于实施语言):
如果您需要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