Powershell 使用VBScript将Unicode字符串编码为Base64

Powershell 使用VBScript将Unicode字符串编码为Base64,powershell,unicode,encoding,vbscript,Powershell,Unicode,Encoding,Vbscript,我想将powershell命令(字符串(get date).date)编码为base64,以便通过powershell-encodedcommand xxx运行它 使用标准VBS方法(甚至)我得到了不运行的kgdldc1kyxrlksk5kyxrl 使用以下powershell脚本: $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($by

我想将powershell命令(字符串
(get date).date
)编码为base64,以便通过
powershell-encodedcommand xxx
运行它

使用标准VBS方法(甚至)我得到了不运行的
kgdldc1kyxrlksk5kyxrl

使用以下powershell脚本:

$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
我得到的
kabnaguadaatagqayqb0aguakquagqayqb0agua
有效。不同之处在于命令首先编码为Unicode字节


有没有人能提供一个VBS函数来实现这一点,或者提供与Unicode.GetBytes()等效的VBS函数,以便我们能够得到正确的字符串编码?

我不确定这是否能满足您的所有需求,但至少它与您问题中指出的输出相匹配

函数ToBase64(ByVal文本) 常量adTypeText=2 常量adTypeBinary=1 '右键为每个字符填充一个null 使用新的RegExp .Pattern=“()” .Global=True text=.Replace(文本“$1”和Chr(0)) 以 '将字符串转换为二进制 使用WScript.CreateObject(“ADODB.Stream”) .Type=adTypeText .CharSet=“us ascii” 打开 .WriteText文本 .位置=0 .Type=adTypeBinary text=.Read 以 '将二进制编码为Base64 使用WScript.CreateObject(“Msxml2.DOMDocument.6.0”).CreateElement(“base64”) .dataType=“bin.base64” .nodeTypedValue=文本 ToBase64=替换(.text,vbLf,“”) 以 端函数 WScript.Echo ToBase64(“(get date.date”) 编辑只是为了使我以前的代码适应您可以在其中找到
powershell
要求的详细信息以及有关代码工作方式的所有详细信息

函数ToBase64(ByVal文本) 常量adTypeText=2 常量adTypeBinary=1 '更改字符串编码 使用WScript.CreateObject(“ADODB.Stream”) '将输入字符串转换为UTF-16 LE .Type=adTypeText .CharSet=“utf-16le” 打开 .WriteText文本 '获取字符串的二进制表示形式 .位置=0 .Type=adTypeBinary .位置=2'跳过物料清单 text=.Read 以 '将二进制编码为Base64 使用WScript.CreateObject(“Msxml2.DOMDocument.6.0”).CreateElement(“base64”) .dataType=“bin.base64” .nodeTypedValue=文本 ToBase64=替换(.text,vbLf,“”) 以 端函数 WScript.Echo ToBase64(“(get date.date”)
我不确定这是否能满足您的所有需求,但至少它与您问题中指出的输出相匹配

函数ToBase64(ByVal文本) 常量adTypeText=2 常量adTypeBinary=1 '右键为每个字符填充一个null 使用新的RegExp .Pattern=“()” .Global=True text=.Replace(文本“$1”和Chr(0)) 以 '将字符串转换为二进制 使用WScript.CreateObject(“ADODB.Stream”) .Type=adTypeText .CharSet=“us ascii” 打开 .WriteText文本 .位置=0 .Type=adTypeBinary text=.Read 以 '将二进制编码为Base64 使用WScript.CreateObject(“Msxml2.DOMDocument.6.0”).CreateElement(“base64”) .dataType=“bin.base64” .nodeTypedValue=文本 ToBase64=替换(.text,vbLf,“”) 以 端函数 WScript.Echo ToBase64(“(get date.date”) 编辑只是为了使我以前的代码适应您可以在其中找到
powershell
要求的详细信息以及有关代码工作方式的所有详细信息

函数ToBase64(ByVal文本) 常量adTypeText=2 常量adTypeBinary=1 '更改字符串编码 使用WScript.CreateObject(“ADODB.Stream”) '将输入字符串转换为UTF-16 LE .Type=adTypeText .CharSet=“utf-16le” 打开 .WriteText文本 '获取字符串的二进制表示形式 .位置=0 .Type=adTypeBinary .位置=2'跳过物料清单 text=.Read 以 '将二进制编码为Base64 使用WScript.CreateObject(“Msxml2.DOMDocument.6.0”).CreateElement(“base64”) .dataType=“bin.base64” .nodeTypedValue=文本 ToBase64=替换(.text,vbLf,“”) 以 端函数 WScript.Echo ToBase64(“(get date.date”)
PowerShell仅接受带有
-EncodedCommand
参数。
UTF-16 LE是Unicode的缩写,它将绝大多数Unicode字符(代码点)分别编码为两个字节;它也是VBScript和PowerShell内部使用的字符串编码

相比之下,大多数VBScript解决方案都使用单字节ASCII编码,即使是值得称赞的Unicode aware也只提供基于UTF-8的编码(对于使用其他语言字符进行编码的西方语言来说,这是一种单字节编码,表示为2-4字节)

这是一个健壮的基于UTF-16 LE的Base64编码解决方案

我发布了一个更模块化的变体,可选地支持UTF-8;这两个位置中的代码都基于

示例呼叫:

Base64EncodeUtf16Le(“(获取日期).date”)”->“kabnaguadaatagqayqb0aguakquagqayqb0agua”
源代码:帮助简化解决方案的提示

”Base64使用UTF-16 LE作为基础文本对指定字符串进行编码
'编码。
函数Base64EncodeUtf16Le(ByVal sText)
暗bytesUtf16Le
'创建一个aux。我们可以从中获得二进制(字节数组)的流
'以UTF-16 LE编码表示输入字符串。
使用CreateObject(“ADODB.Stream”)
'创建UTF 16-LE编码的文本流。。。
.Type=2'adTypeText
.Charset=“utf