Vbscript e64(Str64) 尺寸B1(),B2() 尺寸i1、i2、i3、LLen、UNum、s2、sRet、ANums 尺寸A255(255) 出错时继续下一步 ANums=数组(65、66、67、68、69、70、71、72、73、74、75、76、77、78、79、80、81、82、83、84、85、86、87、88、89、90、97、98、99、100、101、102、103、104、105、106、107、108、109、110、111、112、113、114、116、117、118、119、120、121、122、48、49、50、51、53、54、55、56、57、43、47) 对于i1=0到255 A255(i1)=64 下一个 对于i1=0到63 A255(ANums(i1))=i1 下一个 s2=替换(Str64,vbCr,“”) s2=替换(s2,vbLf,“”) s2=替换(s2,“,”) s2=修剪(s2) LLen=Len(s2) 雷迪姆B1(LLen-1) 对于i1=1到LLen B1(i1-1)=Asc(Mid(s2,i1,1)) 下一个 '--B1现在作为数组在字符串中。 雷迪姆B2((LLen\4)*3-1) i2=0 对于i1=0到UBound(B1)步骤4 B2(i2)=(A255(B1(i1))*4)或(A255(B1(i1+1))\16) i2=i2+1 B2(i2)=(A255(B1(i1+1))和15)*16或(A255(B1(i1+2))\4) i2=i2+1 B2(i2)=(A255(B1(i1+2))和3)*64或A255(B1(i1+3)) i2=i2+1 下一个 如果B1(LLen-2)=61,则 i2=2 ElseIf B1(LLen-1)=61然后 i2=1 其他的 i2=0 如果结束 UNum=UBound(B2)-i2 雷迪姆大学(联合国大学) 对于i1=0到UBound(B2) B2(i1)=Chr(B2(i1)) 下一个 DecodeBase64=连接(B2,“”) 端函数

Vbscript e64(Str64) 尺寸B1(),B2() 尺寸i1、i2、i3、LLen、UNum、s2、sRet、ANums 尺寸A255(255) 出错时继续下一步 ANums=数组(65、66、67、68、69、70、71、72、73、74、75、76、77、78、79、80、81、82、83、84、85、86、87、88、89、90、97、98、99、100、101、102、103、104、105、106、107、108、109、110、111、112、113、114、116、117、118、119、120、121、122、48、49、50、51、53、54、55、56、57、43、47) 对于i1=0到255 A255(i1)=64 下一个 对于i1=0到63 A255(ANums(i1))=i1 下一个 s2=替换(Str64,vbCr,“”) s2=替换(s2,vbLf,“”) s2=替换(s2,“,”) s2=修剪(s2) LLen=Len(s2) 雷迪姆B1(LLen-1) 对于i1=1到LLen B1(i1-1)=Asc(Mid(s2,i1,1)) 下一个 '--B1现在作为数组在字符串中。 雷迪姆B2((LLen\4)*3-1) i2=0 对于i1=0到UBound(B1)步骤4 B2(i2)=(A255(B1(i1))*4)或(A255(B1(i1+1))\16) i2=i2+1 B2(i2)=(A255(B1(i1+1))和15)*16或(A255(B1(i1+2))\4) i2=i2+1 B2(i2)=(A255(B1(i1+2))和3)*64或A255(B1(i1+3)) i2=i2+1 下一个 如果B1(LLen-2)=61,则 i2=2 ElseIf B1(LLen-1)=61然后 i2=1 其他的 i2=0 如果结束 UNum=UBound(B2)-i2 雷迪姆大学(联合国大学) 对于i1=0到UBound(B2) B2(i1)=Chr(B2(i1)) 下一个 DecodeBase64=连接(B2,“”) 端函数,vbscript,icons,desktop,ico,.ico,Vbscript,Icons,Desktop,Ico,.ico,在VBScript中,有一种比使用code@Hackoo更简单(更快)的方法将二进制数据转换为Base64。通过使用MSXML2.DOMDocument类,您可以利用Microsoft对Base64的实现。下面是一个脚本,它获取一个二进制文件c:\test.jpg,并将其转换为Base64。生成的Base64编码字符串保存在文本文件中(c:\out.txt)。它使用ADO流将文件读入二进制数组,然后将其传递给例程,该例程使用DOMDocument将二进制数据转换为Base64编码的文本 Cons

在VBScript中,有一种比使用code@Hackoo更简单(更快)的方法将二进制数据转换为Base64。通过使用
MSXML2.DOMDocument
类,您可以利用Microsoft对Base64的实现。下面是一个脚本,它获取一个二进制文件
c:\test.jpg
,并将其转换为Base64。生成的Base64编码字符串保存在文本文件中(
c:\out.txt
)。它使用
ADO流
将文件读入二进制数组,然后将其传递给例程,该例程使用
DOMDocument
将二进制数据转换为Base64编码的文本

Const BINARY_FILE = "c:\test.jpg"
Const BASE64_FILE = "c:\out.txt"

With CreateObject("Scripting.FileSystemObject").CreateTextFile(BASE64_FILE, True)
    .Write BinaryFileToBase64(BINARY_FILE)
    .Close
End With

Function BinaryFileToBase64(strFileName)

    With CreateObject("ADODB.Stream")
        .Type = 1                                   ' Specify binary data (adTypeBinary)
        .Open
        .LoadFromFile strFileName
        BinaryFileToBase64 = Base64Encode(.Read)    ' Read binary contents into VT_UI1 | VT_ARRAY
    End With

End Function

' This function accepts binary (VT_UI1 | VT_ARRAY) data and converts it to Base64-encoded text (Unicode string).
Function Base64Encode(BinaryData) ' As String

    With CreateObject("MSXML2.DOMDocument.3.0").CreateElement("Base64")
        .DataType = "bin.base64"        ' Set the type of data the element should store
        .NodeTypedValue = BinaryData    ' Write the binary data
        Base64Encode = .Text            ' Read it back as text
    End With

End Function
因此,您可以使用此脚本将任何二进制文件转换为其Base64编码的字符串表示形式。例如,这是堆栈溢出的图标,另存为12x15位图:

Qk1SAgAAAAAAADYAAAAoAAAADAAAAA8AAAABABgAAAAAABwCAAAAAAAAAAAAAAAAAAAAAAAA
hoOChoOChoOChoOChoOChoOChoOChoOChoOChoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPl
3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlhoOChoOChoOChoOChoOChoOC3uPlhoOC3uPl3uPl
hoOC3uPl3uPl3uPl3uPl3uPl3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlcIyocIyocIyocIyo
cIyocIyo3uPlhoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPlwtTdn8DV3uPlhoOC3uPl3uPl
3uPl3uPl2uHknL/UcafJVpfCVJbCbKPI3uPl3uPl3uPl3uPl3+Tm3+TmVZfCXJvEeKvLr8na
3+Tmbq7cVKHZ3+Tm3+Tm3+Tm4eXn4eXn3ePm4eXn4eXnsM3iP5fYQZjXs8/jV6Tx097o4eXn
4ubo4ubo4ubo3uToY6jbN5PXdbLc3eToOJb0K4/0e63vdqrw4+fp4+fp4+fpQZjYRZvYwNbl
3uXpOJb0LZD00t7qMYP1lLvu5Ojq5Ojq5OjqxNjm5Ojq3+bqOpf0LpH01uHrcafwPInz5Ojq
5enr5enr5enr5enr5enrRJzzLpH01+Lr3OTrMIP1psbu5enr5+rs5+rs5+rs5+rs5+rsrs7u
3eXs5+rsZqLyQ4705+rs5+rs6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6OvtN4f0s83v6Ovt6Ovt
要解码Base64编码的字符串,我们只需要反向执行这些步骤。首先,我们将文本解码回其原始二进制形式。然后,我们将二进制数据写入一个文件

CONST NEW_BINARY_FILE = "c:\test2.jpg"

With CreateObject("Scripting.FileSystemObject").OpenTextFile(BASE64_FILE)
    Base64ToBinaryFile .ReadAll(), NEW_BINARY_FILE
    .Close
End With

Sub Base64ToBinaryFile(strBase64, strFileName)

    With CreateObject("ADODB.Stream")
        .Type = 1                       ' adTypeBinary
        .Open
        .Write Base64Decode(strBase64)  ' Write the byte array
        .SaveToFile strFileName, 2      ' Overwrite if file exists (adSaveCreateOverWrite)
    End With

End Sub

Function Base64Decode(ByVal strText) ' As ByteArray

    With CreateObject("MSXML2.DOMDocument.3.0").CreateElement("Base64")
        .DataType = "bin.base64"
        .Text = strText
        Base64Decode = .NodeTypedValue
    End With

End Function
那么,回到您最初的问题,如何在VBScript文件中嵌入二进制(
ICO
)文件?您可以将Base64字符串添加到某个位置。把它放在结尾,开始,中间的某个地方。当然,它需要被注释掉,因为它不是有效的VBScript。您可能需要添加一个开始和结束分隔符,以便知道它的开始和结束位置。例如:

' Read ourself...
With CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.ScriptFullName)

    ' Look for the "start"...
    Do Until .AtEndOfStream

        strLine = .ReadLine()

        If strLine = "' ~END~" Then fRead = False
        If fRead Then strBase64 = strBase64 & Mid(strLine, 3)
        If strLine = "' ~START~" Then fRead = True

    Loop

End With

' Re-create our bitmap!
Base64ToBinaryFile strBase64, "c:\stack_overflow.bmp"

' ~START~
' Qk1SAgAAAAAAADYAAAAoAAAADAAAAA8AAAABABgAAAAAABwCAAAAAAAAAAAAAAAAAAAAAAAA
' hoOChoOChoOChoOChoOChoOChoOChoOChoOChoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPl
' 3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlhoOChoOChoOChoOChoOChoOC3uPlhoOC3uPl3uPl
' hoOC3uPl3uPl3uPl3uPl3uPl3uPl3uPl3uPlhoOC3uPl3uPlhoOC3uPlcIyocIyocIyocIyo
' cIyocIyo3uPlhoOC3uPl3uPlhoOC3uPl3uPl3uPl3uPl3uPlwtTdn8DV3uPlhoOC3uPl3uPl
' 3uPl3uPl2uHknL/UcafJVpfCVJbCbKPI3uPl3uPl3uPl3uPl3+Tm3+TmVZfCXJvEeKvLr8na
' 3+Tmbq7cVKHZ3+Tm3+Tm3+Tm4eXn4eXn3ePm4eXn4eXnsM3iP5fYQZjXs8/jV6Tx097o4eXn
' 4ubo4ubo4ubo3uToY6jbN5PXdbLc3eToOJb0K4/0e63vdqrw4+fp4+fp4+fpQZjYRZvYwNbl
' 3uXpOJb0LZD00t7qMYP1lLvu5Ojq5Ojq5OjqxNjm5Ojq3+bqOpf0LpH01uHrcafwPInz5Ojq
' 5enr5enr5enr5enr5enrRJzzLpH01+Lr3OTrMIP1psbu5enr5+rs5+rs5+rs5+rs5+rsrs7u
' 3eXs5+rsZqLyQ4705+rs5+rs6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6Ovt6OvtN4f0s83v6Ovt6Ovt
' ~END~

使用Windows内置CERTUTIL命令可能有一种更简单的方法:

  • 使用CERTUTIL(CERTUTIL-Encode ICON.ico ICON.b64)对图标(或其他二进制)文件进行编码
  • 在脚本中添加Base64代码,包括前缀(REM)
  • 使用下一个代码删除REM并将Base64代码解码为二进制:

    dim fso : set fso=CreateObject("scripting.FileSystemObject")
    dim wsh : set wsh=CreateObject("wscript.shell")
    
    '--- Extract ICO file...
    iconFile=fso.GetSpecialFolder(2) & "\icon"
    set f=fso.OpenTextFile(WScript.ScriptFullName)
    s=replace(f.ReadAll,"' ","")
    f.close
    set f=fso.OpenTextFile(iconFile & ".tmp",2,TRUE)
    f.writeline(s)
    f.close
    wsh.run "certutil -decode " & iconFile & ".tmp" & " " & iconFile & ".ico",0,true
    
    ' --- This is the output of the CERTUTIL encode command:
    ' -----BEGIN CERTIFICATE-----
    ' AAABAAYAEBAAAAAACABoBQAAZgAAACAgAAAAAAgAqAgAAM4FAAAwMAAAAAAIAKgO
    ' AAB2DgAAEBAAAAAAIABoBAAAHh0AACAgAAAAACAAqBAAAIYhAAAwMAAAAAAgAKgl
    ' ..
    ' ..
    ' AAAAHwAA/AAAAAA/AAD+AAAAAH8AAP+AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/4
    ' AAAf/wAA//4AAH//AAD//8AD//8AAA==
    ' -----END CERTIFICATE-----
    

  • 我可以想出几个办法。如果使用的是
    WSF
    ,则可以将二进制数据作为Base64嵌入
    CDATA
    部分。或者,您可以使用常规的
    VBS
    文件,并在脚本后嵌入Base64作为注释。在任何一种情况下,您都只需要读取Base64并将其转换为二进制,然后将其写入
    ICO
    文件。感谢您的快速响应。你知道我在哪里可以找到你提到的第二种选择的例子吗?我尝试用谷歌搜索它,但到目前为止,我只找到了将Base64数据转换为文本字符串的方法。
    dim fso : set fso=CreateObject("scripting.FileSystemObject")
    dim wsh : set wsh=CreateObject("wscript.shell")
    
    '--- Extract ICO file...
    iconFile=fso.GetSpecialFolder(2) & "\icon"
    set f=fso.OpenTextFile(WScript.ScriptFullName)
    s=replace(f.ReadAll,"' ","")
    f.close
    set f=fso.OpenTextFile(iconFile & ".tmp",2,TRUE)
    f.writeline(s)
    f.close
    wsh.run "certutil -decode " & iconFile & ".tmp" & " " & iconFile & ".ico",0,true
    
    ' --- This is the output of the CERTUTIL encode command:
    ' -----BEGIN CERTIFICATE-----
    ' AAABAAYAEBAAAAAACABoBQAAZgAAACAgAAAAAAgAqAgAAM4FAAAwMAAAAAAIAKgO
    ' AAB2DgAAEBAAAAAAIABoBAAAHh0AACAgAAAAACAAqBAAAIYhAAAwMAAAAAAgAKgl
    ' ..
    ' ..
    ' AAAAHwAA/AAAAAA/AAD+AAAAAH8AAP+AAAAA/wAA/8AAAAP/AAD/4AAAB/8AAP/4
    ' AAAf/wAA//4AAH//AAD//8AD//8AAA==
    ' -----END CERTIFICATE-----