2014-03-02 3 views
1

나는 매일 밤마다 vbscript를 사용하여 빌드를 증가시키는 rc 파일을 가지고 있습니다. FILEVERSION과 PRODUCTVERSION을 증가 시키지만 모든 키워드 값을 증가시킬 수는 없습니다. 빌드가 VS2012입니다. ","3.0.0.0vbscript를 사용하여 resourse 파일의 모든 값을 증가 시키십시오.

rcfile = "C:\Build\VS2012Build\SHClientServer\SHSApplicationDLL\SHSApplicationDLL.rc" 

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

Function IncMaint(m, g1, g2, g3, pos, src) 
    IncMaint = g1 & (Int(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 

나는 또한 값 "VALUE"의 FileVersion을 증가 할 필요가 "와 VALUE"

는 RC 파일입니다

// 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 (Israel) resources 

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

#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,0,0 
PRODUCTVERSION 3,0,0,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.0.0" 
      VALUE "InternalName", "SHSAppli" 
      VALUE "LegalCopyright", "Copyright (C) 2011" 
      VALUE "OriginalFilename", "SHSAppli.dll" 
      VALUE "ProductName", "SHSAppli Dynamic Link Library" 
      VALUE "ProductVersion", "3.0.0.0" 
     END 
    END 
    BLOCK "VarFileInfo" 
    BEGIN 
     VALUE "Translation", 0x400, 1200 
    END 
END 

#endif // Hebrew (Israel) resources 
///////////////////////////////////////////////////////////////////////////// 



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


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

이것은 스크립트입니다 PRODUCTVERSION ","당신의 도움에 대한 3.0.0.0 "

감사

답변

1

확실하지, 당신이 정말로 그것을해야 할 경우 - 그 .rc 파일은 UTF8로 인코딩되지 않습니까? 하지만 꼭해야만한다면 두 번째 패턴은 숫자가 "."로 구분된다는 사실을 반영하십시오. (점)가 아니라 ";" (쉼표)를 사용하고 공백을 두십시오.

"(""(?:ProductVersion|FileVersion)"", ""\d+, \d+,)(\d+)(, \d+"")" 
             ^ ^^  ^^ 

업데이트 WRT 코멘트 :

cscript 22130287.vbs 
I'M PLAIN ASCII OR ELSE 

VS_VERSION_INFO VERSIONINFO 
FILEVERSION 3,0,0,0 
PRODUCTVERSION 3,0,0,0 

BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040004b0" 
     BEGIN 
      VALUE "FileDescription", "SHSAppli Dynamic Link Library" 
      VALUE "FileVersion", "3.0.0.0" 
      VALUE "ProductVersion", "3.0.0.0" 
     END 

----------------- 
*** FILEVERSION 3,0,|0|,0 
*** PRODUCTVERSION 3,0,|0|,0 
*** "FileVersion", "3.0.|0|.0" 
*** "ProductVersion", "3.0.|0|.0" 
I'M PLAIN ASCII OR ELSE 

VS_VERSION_INFO VERSIONINFO 
FILEVERSION 3,0,1,0 
PRODUCTVERSION 3,0,1,0 

BEGIN 
    BLOCK "StringFileInfo" 
    BEGIN 
     BLOCK "040004b0" 
     BEGIN 
      VALUE "FileDescription", "SHSAppli Dynamic Link Library" 
      VALUE "FileVersion", "3.0.1.0" 
      VALUE "ProductVersion", "3.0.1.0" 
     END 
:

두 번째 패턴을 고정하고 대체 기능에 diagostic 라인을 가하고 후, 나는 단순화 아스키 코드 파일이 출력을 얻을

업데이트 II : 사용하는 스크립트 :

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 
Dim sAll : sAll  = goFS.OpenTextFile("22130287.rc").ReadAll() 
WScript.Echo sAll 
WScript.Echo "-----------------" 

Dim re : Set re = New RegExp 
re.Global = True 
re.IgnoreCase = True 

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

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

WScript.Echo sAll 
WScript.Quit 0 

Function IncMaint(m, g1, g2, g3, pos, src) 
    WScript.Echo "***", Join(Array(g1, g2, g3), "|") 
    IncMaint = g1 & (Int(g2)+1) & g3 
End Function 

업데이트 III는 :

너무 here를보고하십시오.

+0

그래도 여전히 작동하지 않습니다. – Newton

+0

@Ekkehard 파일이 어떻게 인코딩되는지는 중요하지 않습니다. 맞습니까? 일단 파일을 OpenTextFile과 ReadAll로 VBScript로 읽으면 유니 코드 문자열이됩니다. 그리고'RegExp'는 기본적으로 유니 코드 문자열에서 작동합니다. – Bond

+1

@ 본드 - 문제가되는 증거를 보려면 http://stackoverflow.com/questions/21396199/vbs-script-attempting-to-write-to-rc-file-returns-error를 참조하십시오. –

관련 문제