Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell确定base64字符串文件扩展名_Powershell - Fatal编程技术网

Powershell确定base64字符串文件扩展名

Powershell确定base64字符串文件扩展名,powershell,Powershell,我有一个XML文件,其中包含以Base64编码的文件附件(InfoPath)。当我使用Powershell解码附件的Base64字符串时,似乎我必须将文件路径和扩展名写入writealBytes命令,但我不知道原始文件是否为PDF、图像文件、DOCX、,等等-有没有办法让它将字符串写入原始文件名和/或扩展名,然后我只指定它需要去的文件夹?示例代码: $b64str = $xml.myRootNode.attachmentNode $someFileName = somehow get origi

我有一个XML文件,其中包含以Base64编码的文件附件(InfoPath)。当我使用Powershell解码附件的Base64字符串时,似乎我必须将文件路径和扩展名写入writealBytes命令,但我不知道原始文件是否为PDF、图像文件、DOCX、,等等-有没有办法让它将字符串写入原始文件名和/或扩展名,然后我只指定它需要去的文件夹?示例代码:

$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)