尝试写入.rc文件的VBS脚本返回错误

时间:2014-01-28 03:19:39

标签: c++ vbscript resources

我正在尝试找到一个编辑和写入资源.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文件。

3 个答案:

答案 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值的正则表达式,但希望我能在合理的时间内解决这个问题。