2

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

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

  1. 打开一个 JSON 文件 ( %userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences) 并将内容读入一个字符串;
  2. 搜索名为“download”的特定节点,该节点预先填充了多行值,这些值可能在构建之间有所不同;
  3. 用指定的多行文本替换大括号之间的整个文本;和
  4. 将更新后的字符串写入原始文件并保存。

完整的 JSON 文件相当大,但作为输入的示例,它是从典型的 Google Chrome 首选项 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 知识有限.

4

1 回答 1

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":这样,表达式匹配关键字后面一对花括号之间的所有内容。

于 2012-11-27T17:31:04.123 回答