Powershell确定base64字符串文件扩展名
我有一个XML文件,其中包含以Base64编码的文件附件(InfoPath)。当我使用Powershell解码附件的Base64字符串时,似乎我必须将文件路径和扩展名写入writealBytes命令,但我不知道原始文件是否为PDF、图像文件、DOCX、,等等-有没有办法让它将字符串写入原始文件名和/或扩展名,然后我只指定它需要去的文件夹?示例代码:Powershell确定base64字符串文件扩展名,powershell,Powershell,我有一个XML文件,其中包含以Base64编码的文件附件(InfoPath)。当我使用Powershell解码附件的Base64字符串时,似乎我必须将文件路径和扩展名写入writealBytes命令,但我不知道原始文件是否为PDF、图像文件、DOCX、,等等-有没有办法让它将字符串写入原始文件名和/或扩展名,然后我只指定它需要去的文件夹?示例代码: $b64str = $xml.myRootNode.attachmentNode $someFileName = somehow get origi
$b64str = $xml.myRootNode.attachmentNode
$someFileName = somehow get original filename
$someFileExtension = somehow get original extension
$filepath = "C:\myFolder\$someFileName.$someFileExtension"
$bytes = [Convert]::FromBase64String($b64str)
[IO.File]::WriteAllBytes($filepath,$bytes)
编辑:由于评论者的努力,找到了答案。对于将来必须执行此操作的用户,可以使用Powershell从库中的InfoPath表单提取附件提示:InfoPath attachment base64字符串由三部分组成:标题、文件名和文件内容。标头的长度为24字节,但在字节20处包含文件名的长度。使用该数字乘以2(对于Unicode),然后将文件名提取到新的字节数组中。最后,创建一个新的数组来承载内容的字节(全长减去起始头长度24和文件名字节),这就是从base64转换回来的内容。以下是我最后做的事情(仅适用于InfoPath XML文件):
我想关键是如何计算原始文件名和扩展名?大概这种元数据不在XML中。虽然某些文件格式可能会引用其自己的文件名,但肯定不是所有文件格式都会引用,因此这将是非常不可靠的。看起来有一个标题包含此详细信息,但我没有这样做的经验,但我确实找到了(对于InfoPath 2007),这可能会有一些用处。谢谢@ConnorLSW,我想关键是如何计算出原始文件名和扩展名?大概这种元数据不在XML中。虽然某些文件格式可能会引用其自己的文件名,但肯定不是所有文件格式都会引用,因此这将是非常不可靠的。看起来有一个标题包含此详细信息,但我没有这样做的经验,但我确实找到了(对于InfoPath 2007),这可能会有一些用处。谢谢@ConnorLSW,这给了我解决问题的信息。
$b64str = $xml.myRootNode.attachmentNode
$bytes = [Convert]::FromBase64String($b64str)
$arrFileNameBytes = @()
$fileNameByteLen = $bytes[20]*2
for($i=0;$i -lt $fileNameByteLen;$i+=2){
$arrFileNameBytes+=$bytes[24+$i]
}
$arrFileContentBytes = @()
$fileContentByteLen = $bytes.length-(24+$fileNameByteLen)
for($i=0;$i -lt $fileContentByteLen;$i++){
$arrFileContentBytes+=$bytes[24+$i+$fileNameByteLen]
}
$fileName = [System.Text.Encoding]::ASCII.GetString($arrFileNameBytes)
$fileName = $filename.trim()
$fileName = $filename.substring(0,$filename.length-1)
$filepath = "C:\MyFolder\$fileName"
[IO.File]::WriteAllBytes($filepath,$arrFileContentBytes)