我有一个 vbscript 脚本,它采用 .ico 文件并使用它作为图标创建桌面快捷方式,但如果可能的话,我希望能够将脚本所需的所有内容存储在其自身中。
最佳答案
与使用 @Hackoo 发现的代码相比,有一种更简单(也更快)的方法可以在 VBScript 中将二进制数据转换为 Base64。您可以通过使用 MSXML2.DOMDocument
类来利用 Microsoft 的 Base64 实现。下面的脚本采用二进制文件 c:\test.jpg
并将其转换为 Base64。生成的 Base64 编码字符串保存在文本文件 (c:\out.txt
) 中。它使用 ADO Stream
将文件读入二进制数组,然后将其传递给使用 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 编码的字符串表示形式。例如,这是 Stack Overflow 的图标,保存为 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~
关于vbscript - 是否可以在 vbscript 中存储 .ico 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638375/