使用VBScript查找并替换JSON文件中节点的花括号之间的所有多行文本

时间:2012-11-27 16:25:28

标签: regex vbscript replace

作为Windows登录脚本的一部分(因此是VBScript要求),我想在用户的Google Chrome偏好设置(存储在用户配置文件中的JSON文件中)中设置值,以便在登录时应用下载设置。

我正在努力实现以下目标:

  1. 打开JSON文件(%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences)并将内容读取为字符串;
  2. 搜索名为“download”的特定节点,其中预先填充了可能因构建而异的多行值;
  3. 用指定的多行文字替换大括号之间的整个文本;和
  4. 将更新的字符串写入原始文件并保存。
  5. 完整的JSON文件相当大,但作为用作输入的示例,这是从典型的Google Chrome prefs JSON文件中复制的:

    "bookmark_bar": {
        "show_on_all_tabs": false
    },
    "download": {
        "directory_upgrade": true,
        "prompt_for_download": false
    },
    "sync": {
        "suppress_start": true
    },
    

    我想以编程方式搜索“下载”节点,并替换此节点的大括号之间的所有内容,使其显示为:

    "download": {
        "default_directory": "C:\\Windows\\Temp",
        "extensions_to_open": "pdf",
        "prompt_for_download": false
    },
    

    ...文件内容的其余部分保持不变。

    考虑到要替换的JSON部分中的空格和多行,以及在括号之间包含所有/任何文本的通配符要求,我不能使用VBScript Replace函数执行此操作,但我的RegEx知识有限。

1 个答案:

答案 0 :(得分:3)

您可以使用正则表达式进行替换:

prefsFile = "%userprofile%\Local Settings\...\Preferences"
prefsFile = CreateObject("WScript.Shell").ExpandEnvironmentStrings(prefsFile)

newPrefs = "..."

Set fso = CreateObject("Scripting.FileSystemObject")

json = fso.OpenTextFile(prefsFile).ReadAll

Set re = New RegExp
re.Pattern = """download"": {[\s\S]*?},"

json = re.Replace(json, """download"": {" & vbCrLf & newPrefs & vbCrLf & "},")

fso.OpenTextFile(prefsFile, 2).Write(json)

模式[\s\S]匹配任何空格或非空白字符。在这种情况下,您不能使用.,因为该特殊字符与换行符不匹配,并且您希望表达式跨越多行。限定符*?分别表示“匹配任意数量的字符”和“使用最短匹配”。这样,表达式匹配"download":关键字之后的一对花括号之间的所有内容。