[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
为啥示例里的文件名一个.H 一个.ZBS 一个.TBS ? 这有啥规律不? 还是都这样? 名字会重复不? 会的话要如何处理?
为啥示例里的文件内容一个是BidFileTable的value 一个是FileTable的value? 会出现其他的不? 还是都这样? 会出现多个的value不? 会的话要如何处理?
为啥示例文件的合并结果value值解码后开头是PK? 所有文件使用7zip压缩 ,是指用7zip压缩成zip不?

TOP

这样行不?
保存ansi或gbk编码的bat ,然后放到包含需要处理的文件夹下运行
7z.exe所在路径和输出路径自行设置
  1. @{}#? 2>nul&powershell -c "type -literalpath '%~f0'|out-string|iex"&exit/b
  2. $nanaz='Z:\Program Files\7-Zip\7z.exe'
  3. $outpath='Z:\Users\foobar\Desktop'
  4. $p=new-object System.Diagnostics.Process
  5. $p.StartInfo.UseShellExecute=$false
  6. $p.StartInfo.RedirectStandardOutput=$true
  7. $p.StartInfo.FileName=$nanaz
  8. $pargs='a -tzip {0} -so (-_-) "{1}"'
  9. $bf=new-object 'byte[]' (4*1024*1024)
  10. $files=gci -file
  11. foreach($file in $files){
  12. $dir=$file.basename
  13. if([io.directory]::exists($pwd.path+"\$dir")){
  14. $coding='default'
  15. $str=gc -LiteralPath ($file.fullname) -raw
  16. if($str -Match 'encoding *= *"utf-?8"'){
  17. $coding='utf8';$str=gc -LiteralPath ($file.fullname) -raw -encoding $coding
  18. }
  19. $pw="";if($str -match '(?<=uniquecode=")[^"]*(?=")'){$pw='-p'+$matches[0]}
  20. $p.StartInfo.Arguments=$pargs -f $pw,($dir+"\*")
  21. $p.start()
  22. $ms=new-object 'system.io.memorystream'
  23. $done=$false;while(-not $done){
  24. $c=$p.StandardOutput.BaseStream.read($bf,0,$bf.length)
  25. if($c){$ms.write($bf,0,$c)}else{$done=$true}
  26. }
  27. if($str -match '<..*? value="'){
  28. $v=$matches[0]
  29. $t=$str -split '<..*? value="',2
  30. }else{
  31. write-host "未找到value ,自动添加" -ForegroundColor yellow
  32. $v='<qwertyuiop Value="'
  33. $t=@($str,'" />')
  34. }
  35. $p.WaitForExit()
  36. $ms.capacity=$ms.length
  37. write-host ("保存到文件:"+$outpath+"\已合并_"+$file.name) -ForegroundColor green
  38. set-content -LiteralPath ($outpath+"\已合并_"+$file.name) -encoding $coding -value @(
  39. $t[0],$v,[convert]::ToBase64String($ms.getbuffer(),0,$ms.length),$t[1]) -nonewline
  40. }else{
  41. write-host "找不到文件夹: $dir" -ForegroundColor red
  42. }}
  43. "`ndone"
  44. cmd /c pause
复制代码

TOP

回复 8# 304802301


    正常 ,压缩时使用的算法 ,算法版本 ,压缩参数 ,写入方式之类的都会影响压缩出来的数据 ,只要压缩出来的数据不同base64的结果就不同
7楼代码由于写入方式跟常规不一样 ,所以压缩后的base64跟常规的不一样 ,虽然base64不同 ,但是base64解码还原后的压缩包应该是能正常解压的 ,并且解压后跟原来的一样的
总之 ,没啥特别要求的话 ,应该测试看看base64解码还原后的压缩包能不能正常解压 ,解压后跟原来是否一样

TOP

回复 14# 304802301


    将7楼代码第22行换成下面的 ,因为使用的是字符串 ,base64解码后涉及字符串编码问题 ,简单的判断了下编码
  1. $pw="";if($str -match '(?<=uniquecode=")[^"]*(?=")'){
  2. if($Matches[0]){$pw=$matches[0];$o=$pw.Length%4
  3. if($o){$pw=$pw+'===='.Substring(0,4-$o)}
  4. $pwdc=[text.encoding]::utf8.getstring([convert]::FromBase64String($pw))
  5. if($pwdc -match '\?'){
  6. write-host "密码的编码可能不是utf8 ,将使用默认编码" -ForegroundColor yellow
  7. $pwdc=[text.encoding]::default.getstring([convert]::FromBase64String($pw))}
  8. $pw='-p"'+$pwdc+'"'
  9. }}
复制代码

TOP

啊 ,代码没有排除bat本身 ,bat的名字最好取个唯一的名字 ,也就是说不要有跟bat对应的文件夹

TOP

回复 16# Five66


    改一下 ,加上了密码base64解码后包含英文双引号时的处理
将7楼代码第22行换成下面的 ,因为使用的是字符串 ,密码base64解码后可能涉及字符串编码问题 ,简单的判断了下编码
代码没有排除bat本身 ,bat的名字最好取个唯一的名字 ,也就是说最好不要有跟bat对应的文件夹 ,不然对应的文件夹也会压缩处理
  1. $pw="";if($str -match '(?<=uniquecode=")[^"]*(?=")'){
  2. if($Matches[0]){$pw=$matches[0];$o=$pw.Length%4
  3. if($o){$pw=$pw+'===='.Substring(0,4-$o)}
  4. $pwdc=[text.encoding]::utf8.getstring([convert]::FromBase64String($pw))
  5. if($pwdc -match '\?'){
  6. write-host "密码的编码可能不是utf8 ,将使用默认编码" -ForegroundColor yellow
  7. $pwdc=[text.encoding]::default.getstring([convert]::FromBase64String($pw))}
  8. $pwdc=[regex]::replace($pwdc,'\\+"|""+|"',[scriptblock]::create('"\"+($args[0].value.tochararray() -join "\")'))
  9. $pw='-p"'+$pwdc+'"'
  10. }}
复制代码

TOP

返回列表