VBS中EncodedCommand编码命令是否存在字符长度限制?
解决VBS调用超长Base64编码PowerShell脚本报错问题
问题原因
Windows命令行(cmd.exe)对单个命令的参数长度有8191字符的上限,你的Base64编码内容已经达到87万多字符,远超这个限制,导致调用时出错。
解决方案
方案1:直接执行本地.ps1文件(推荐)
把PowerShell脚本保存为独立的.ps1文件,VBS直接调用执行该文件,完全避开命令行长度限制:
dim pSCmd ' 替换为你的脚本实际路径 pSCmd = "powershell.exe -noexit -windowstyle Hidden -executionpolicy bypass -file ""C:\your\script\path\script.ps1""" CreateObject("WScript.Shell").Run pSCmd, 0, True
方案2:将Base64编码写入临时文件后执行
如果需要保留编码形式,可先把超长Base64内容写入临时文件,再让PowerShell读取文件解码执行:
dim fso, tempFile, encodedContent, pSCmd encodedContent = "你的超长Base64编码内容" ' 创建临时文件存储Base64内容 Set fso = CreateObject("Scripting.FileSystemObject") tempFile = fso.GetSpecialFolder(2) & "\temp_encoded.base64" Set file = fso.CreateTextFile(tempFile, True) file.Write encodedContent file.Close ' 调用PowerShell读取文件并执行解码后的脚本 pSCmd = "powershell.exe -noexit -windowstyle Hidden -executionpolicy bypass -command ""$encoded = Get-Content '" & tempFile & "' -Raw; [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encoded)) | Invoke-Expression""" CreateObject("WScript.Shell").Run pSCmd, 0, True ' 可选:执行完成后删除临时文件 ' fso.DeleteFile tempFile
方案3:VBS解码Base64后写入临时.ps1文件执行
由VBS先完成Base64解码,将原PowerShell脚本写入临时文件再执行:
dim fso, tempFile, encodedContent, decodedScript, pSCmd encodedContent = "你的超长Base64编码内容" ' VBS解码PowerShell的Unicode Base64编码 Set objXML = CreateObject("MSXML2.DOMDocument.3.0") Set objNode = objXML.CreateElement("base64") objNode.dataType = "bin.base64" objNode.text = encodedContent decodedScript = objXML.Text ' 写入临时.ps1文件(Unicode编码匹配PowerShell要求) Set fso = CreateObject("Scripting.FileSystemObject") tempFile = fso.GetSpecialFolder(2) & "\temp_script.ps1" Set file = fso.CreateTextFile(tempFile, True, True) file.Write decodedScript file.Close ' 执行临时脚本文件 pSCmd = "powershell.exe -noexit -windowstyle Hidden -executionpolicy bypass -file """ & tempFile & """" CreateObject("WScript.Shell").Run pSCmd, 0, True ' 可选:执行完成后删除临时文件 ' fso.DeleteFile tempFile
内容的提问来源于stack exchange,提问作者Nawad-sama
相关产品推荐
相关产品推荐

