[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] (已解决)如何用bat删除文件的16进制前四个字节

本帖最后由 cbbos 于 2023-4-27 12:48 编辑

[img][/img]

如图
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit
  2. Set oFSO = CreateObject("Scripting.FileSystemObject")
  3. Set oStream = CreateObject("ADODB.Stream")
  4. oStream.Type = 1
  5. oStream.Mode = 3
  6. For Each i In WScript.Arguments
  7.     oStream.Open()
  8.     With CreateObject("ADODB.Stream")
  9.         .Type = 1
  10.         .Mode = 3
  11.         .Open()
  12.         .LoadFromFile i
  13.         .Position = 4
  14.         .CopyTo oStream
  15.         .Close()
  16.     End With
  17.     oStream.SaveToFile oFSO.GetBaseName(i) & ".png", 2
  18.     oStream.Close()
  19.     WScript.Echo oFSO.GetBaseName(i) & ".png"
  20. Next
复制代码

QQ 20147578

TOP

回复 12# czjt1234


     大佬这个批处理只能单个文件拖入,能实现一次拖入多个文件吗?

TOP

回复 12# czjt1234


    感谢,最终完美代码。
  1. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" "%~f1" "%~n1.png" & pause & exit
  2. Set oStream = CreateObject("ADODB.Stream")
  3. oStream.Type = 1    'adTypeBinary
  4. oStream.Mode = 3    'adModeReadWrite
  5. oStream.Open()
  6. With CreateObject("ADODB.Stream")
  7.     .Type = 1    'adTypeBinary
  8.     .Mode = 3    'adModeReadWrite
  9.     .Open()
  10.     .LoadFromFile WScript.Arguments(0)
  11.     .Position = 4
  12.     .CopyTo oStream
  13.     .Close()
  14. End With
  15. oStream.SaveToFile WScript.Arguments(1), 2    'adSaveCreateOverWrite
  16. oStream.Close()
复制代码

TOP

"1.sct" "2.sct"
改成
"%~f1" "2.png"
1

评分人数


QQ 20147578

TOP

回复 10# czjt1234


    这个可以,只是每次都要更改文件名,可以做到文件拖上去自动去掉前四字节,然后重新生成一个.png文件吗?(保持原文件名,只需要更改后缀)

TOP

"1.sct" "2.sct"
这2个改成原始文件名,和修改后的文件名

QQ 20147578

TOP

回复 4# jyswjjgdwtdtj


    你好,只要能做到都可以,bat目前好像没找到合适的方法

TOP

回复 5# czjt1234


    感谢回复,显示 去头.bat(11, 5) ADODB.Stream: 文件无法被打开。

TOP

回复 6# 老刘1号


   感谢回复。 这个貌似没法使用,输出了txt,但是没png

TOP

本帖最后由 老刘1号 于 2023-4-24 00:02 编辑

好久没写bat了,写个玩玩
仅供娱乐,速度奇慢,不建议使用
如果有bug请自行修复,不要找我,当然如果没有那更好了(x
输入:input.png
输出:new.png
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. (
  4. for /f "skip=2 delims=" %%. in ('certutil input.png ^| find /v "CertUtil"') do (
  5. for /f "tokens=2-17 delims= " %%a in ("%%.") do (
  6. if defined prev (
  7. rem 这么写是因为最后一行得做特殊处理(certutil输出格式不标准)
  8. echo !prev!
  9. )
  10. if not defined t (
  11. rem 对第一行的16个hex,不显示前4个,就相当于丢掉了
  12. set t=啊
  13. rem 前四个hex也就是%%a %%b %%c %%d 扔掉,,
  14. set "prev=%%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p"
  15. ) else (
  16. set "prev=%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p"
  17. )
  18. )
  19. set "lastline=%%."
  20. )
  21. rem echo !lastline!
  22. )> newhex.txt
  23. (
  24. rem 针对最后一行的特殊处理
  25. rem flag1 -> 读到了第一个非空格的字符
  26. rem flag2 -> 空格分割的第一个字符串读完了
  27. :trim
  28. set "char=!lastline:~,1!"
  29. rem echo !char!
  30. rem pause
  31. if "!char!" == " " (
  32. if "!flag1!" == "yes" set flag2=yes
  33. set "lastline=!lastline:~1!"
  34. ) else (
  35. if "!flag2!" == "yes" goto ok
  36. set flag1=yes
  37. set "lastline=!lastline:~1!"
  38. )
  39. goto trim
  40. :ok
  41. rem  观察certutil输出,hex部分最长48
  42. rem echo ll: !lastline!
  43. rem echo lltrim: !lastline:~,48!
  44. >>newhex.txt echo !lastline:~,48!
  45. )
  46. rem > newhex.txt
  47. certutil -decodehex newhex.txt new.png
  48. pause
复制代码
用certutil结合base64做一些处理也可以,不过太麻烦了我懒得写‘
那个newhex.txt是临时文件,运行完了之后可以删了
1

评分人数

    • buyiyang: certutil还能这样用技术 + 1

TOP

本帖最后由 czjt1234 于 2023-4-23 20:54 编辑
  1. ' & cls & cscript.exe /nologo /e:vbscript "%~f0" "1.sct" "2.sct" & pause & exit
  2. Set oStream = CreateObject("ADODB.Stream")
  3. oStream.Type = 1    'adTypeBinary
  4. oStream.Mode = 3    'adModeReadWrite
  5. oStream.Open()
  6. With CreateObject("ADODB.Stream")
  7.     .Type = 1    'adTypeBinary
  8.     .Mode = 3    'adModeReadWrite
  9.     .Open()
  10.     .LoadFromFile WScript.Arguments(0)
  11.     .Position = 4
  12.     .CopyTo oStream
  13.     .Close()
  14. End With
  15. oStream.SaveToFile WScript.Arguments(1), 2    'adSaveCreateOverWrite
  16. oStream.Close()
复制代码

QQ 20147578

TOP

vbs可不可以?
你好

TOP

这个很难办,因为你这是用专用软件查看的,才能看到16进制码,而你用记事本打开就会发现全是乱码,而cmd只能读取文本,这个估计只能调用外部程序

TOP

本帖最后由 cbbos 于 2023-4-27 11:17 编辑

用bat可以删掉这样前四个字节,然后重新生成一个.png文件吗?(不更改文件名,只需要更改后缀)

TOP

返回列表