我正在尝试找到一个编辑和写入资源.rc文件的过程;我试图使用列出的示例代码 How to increment values in resourse file by using vbscript但两个示例中的最后一行都返回了相同的错误(fso.OpenTextFile(rcfile,2).Write rctext):
Error: Invalid procedure call or argument
Code: 800A0005
Source: Microsoft VBScript runtime error
我修改了脚本以写出.txt文件并且工作正常,但我很困惑,可能导致问题写出.rc文件。
答案 0 :(得分:0)
来自链接样本(简化)
rctext = fso.OpenTextFile(rcfile).ReadAll
rctext = ....
fso.OpenTextFile(rcfile, 2).Write rctext
这个想法是读取所有文件,并且只有没有变量持有对打开文件的引用,它被关闭,然后更改需要更改的内容并再次打开文件,现在用于写入和写入已更改的文件内容
通常,它有效。但有时打开阅读的文件没有足够快地关闭,以后再打开它进行写作。
要确保文件已关闭,然后可以打开以进行写入,请将阅读代码更改为
set f = fso.OpenTextFile(rcfile)
rctext = f.ReadAll
f.Close
答案 1 :(得分:0)
作为你的行
fso.OpenTextFile(rcfile, 2).Write rctext
做三件事(访问fso,打开文件,写入它),有很多事情可能会出错。有关前两个行动的问题,请参阅this answer。另一个answer涉及写作。
在你的情况下,证据 - 使用a.txt而不是b.rc - 使得文件的开放是非常不可能的(因此.Close不会保存你)。我怀疑.rc包含文本流无法编码的Unicode(UTF-8 / UTF-16)数据。
因此要么使用unicode参数来读取/写入使用UTF-16编码打开文件,要么使用ADODB.Stream打开UTF-8。
答案 2 :(得分:0)
似乎我的问题的答案需要你的答案(@MC ND和@ Ekkehard.Horner);此外,一旦我更改了vbs脚本以打开并写入Unicode中的.rc文件,我不知道为什么我必须这样做,脚本能够无误地执行。
以下是vbs脚本的最终形式:
Const ForReading = 1, ForWriting = 2
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const DoNotCreate = false
rcFile = "C:\Path\To\RC\File.rc"
major = 4
minor = 3
maint = 2
build = 1
version = major & "," & minor & "," & maint & "," & build
Set fso = CreateObject("Scripting.FileSystemObject")
Set fileObj = fso.OpenTextFile(rcFile, ForReading, DoNotCreate, TristateTrue)
rcText = fileObj.ReadAll
fileObj.Close
Set regex = New RegExp
regex.Global = True
regex.Pattern = "(PRODUCTVERSION|FILEVERSION) \d+,\d+,\d+,\d+"
rcText = regex.Replace(rcText, "$1 " & version)
regex.Pattern = "(""(ProductVersion|FileVersion)"",) ""\d+, \d+, \d+, \d+"""
rcText = regex.Replace(rcText, "$1 """ & Replace(version, ",", ", ") & """")
Set fileObj = fso.GetFile(rcFile)
Set textStream = fileObj.OpenAsTextStream(ForWriting, TristateTrue)
textStream.Write rcText
textStream.Close
唯一似乎不起作用的是用于替换ProduceVersion | FileVersion值的正则表达式,但希望我能在合理的时间内解决这个问题。