如何使用vbscript增加资源文件中的值

时间:2013-11-10 14:58:06

标签: vbscript

我正在使用vbscript来自动构建应用程序,并且在构建之前的脚本中我需要更新rc文件中的版本号,我得到了一个带有PRODUCTVERSION和FILEVERSION的.rc文件,我想增加一个这两个值,显示的值 - 0.0.0.0,stil无法找到方法,构建语言是C#,我在VS2005和VS2012中构建它

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// Hebrew resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HEB)
#ifdef _WIN32
LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT
#pragma code_page(1255)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 3,0,27,0
 PRODUCTVERSION 3,0,27,0
 FILEFLAGSMASK 0x17L
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040004b0"
        BEGIN
            VALUE "FileDescription", "SHSAppli Dynamic Link Library"
            VALUE "FileVersion", "3, 0, 27, 0"
            VALUE "InternalName", "SHSAppli"
            VALUE "LegalCopyright", "Copyright (C) 2011"
            VALUE "OriginalFilename", "SHSAppli.dll"
            VALUE "ProductName", "SHSAppli Dynamic Link Library"
            VALUE "ProductVersion", "3, 0, 27, 0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x400, 1200
    END
END

#endif    // Hebrew resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

1 个答案:

答案 0 :(得分:1)

尝试使用reglar表达式:

rcfile = "C:\path\to\your.rc"
major = 3
minor = 0
maint = 27
build = 0
version = major & "," & minor & "," & maint & "," & build

Set fso = CreateObject("Scripting.FileSystemObject")
Set re  = New RegExp
re.Global = True

rctext = fso.OpenTextFile(rcfile).ReadAll

re.Pattern = "(PRODUCTVERSION|FILEVERSION) \d+,\d+,\d+,\d+"
rctext = re.Replace(rctext, "$1 " & version)

re.Pattern = "(""(ProductVersion|FileVersion)"",) ""\d+, \d+, \d+, \d+"""
rctext = re.Replace(rctext, "$1 """ & Replace(version, ",", ", ") & """")

fso.OpenTextFile(rcfile, 2).Write rctext

如果产品和文件版本不相同,则每个版本都需要单独的正则表达式。

修改:仅增加维护号码我建议使用replacement function

rcfile = "C:\path\to\your.rc"

Set fso = CreateObject("Scripting.FileSystemObject")
Set re  = New RegExp
re.Global = True

Function IncMaint(m, g1, g2, g3, pos, src)
  IncMaint = g1 & (CInt(g2)+1) & g3
End Function

rctext = fso.OpenTextFile(rcfile).ReadAll

re.Pattern = "((?:PRODUCTVERSION|FILEVERSION) \d+,\d+,)(\d+)(,\d+)"
rctext = re.Replace(rctext, GetRef("IncMaint"))

re.Pattern = "(""(?:ProductVersion|FileVersion)"", ""\d+, \d+, )(\d+)(, \d+"")"
rctext = re.Replace(rctext, GetRef("IncMaint"))

fso.OpenTextFile(rcfile, 2).Write rctext