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

[文本处理] [已解决]批处理调用PowerShell替换cmd脚本自身的问题

  1. powershell "[system.net.webclient]::new().downloadfile('https://mxnzp.com/sl/xxxx','%Tmp%\test.exe')" && (
  2.     for /f "eol=3 skip=1 delims=: tokens=2" %%x in ('certutil -hashfile "%~0" md5 ^| findstr /n ".*"') do (
  3.         for /f "eol=3 skip=1 delims=: tokens=2" %%X in ('certutil -hashfile "%Tmp%\test.exe" md5 ^| findstr /n ".*"') do (
  4.             if /i "%%x" neq "%%X" (
  5.                 del "%~0"
  6.                 move /y "%Tmp%\test.exe" "%~dpn0.exe"
  7.                 call "%~dpn0.exe"
  8.             ) else (
  9.                 del "%Tmp%\test.exe"
  10.             )
  11.         )
  12.     )
  13. )
复制代码
以上代码保存为 .cmd后会打包成 .exe程序;新旧test.exe同为 .cmd打包后的程序。新旧test.exe 的路径不一定相同

大概需要实现的过程是:双击 旧test.exe,运行时会先下载指定链接中的 新test.exe 文件,然后用哈希值进行对比,如果不相等就替换掉 旧test.exe 并运行 新test.exe;如果哈希值相等就删除掉下载下来的 新test.exe

补充修改:
  1. powershell "[system.net.webclient]::new().downloadfile('https://mxnzp.com/sl/xxxx','%Tmp%\test.exe')" 2>nul && (
  2.     (
  3.         echo for /f "eol=3 skip=1 delims=: tokens=2" %%%%x in ^('certutil -hashfile "%%~1.exe" md5 ^^^| findstr /n ".*"'^) do ^(
  4.         echo     for /f "eol=3 skip=1 delims=: tokens=2" %%%%X in ^('certutil -hashfile "%%Tmp%%\test.exe" md5 ^^^| findstr /n ".*"'^) do ^(
  5.         echo         if "%%%%x" neq "%%%%X" ^(
  6.         echo             del "%%~1.exe"
  7.         echo             move /y "%%Tmp%%\test.exe" "%%~1.exe"
  8.         echo             start "" "%%~1.exe"
  9.         echo             exit
  10.         echo             del %%0
  11.         echo         ^) else ^(
  12.         echo             del "%%Tmp%%\test.exe"
  13.         echo             exit /b
  14.         echo         ^)
  15.         echo     ^)
  16.         echo ^)
  17.     ) >"%Tmp%\test.bat"
  18.     call "%Tmp%\test.bat" "%~dpn0"
  19.     del "%Tmp%\test.bat"
  20. )
复制代码
转变了个思路,利用原脚本生成一个新脚本test.bat,在新脚本中进行MD5比对,检查上面代码的时候发现貌似call后面的参数"%~dpn0"无法传给新脚本的"%~1.exe",就差一点了不知道如何解决。

请问各位老师,我上面这条代码该如何修改。谢谢!

============================

经过测试,应该是.exe封包的问题,如果用.cmd直接运行没有这些问题。看来.exe封装是个大坑。算了不纠结封装这个了。
1

评分人数

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

用powershell的话 试试这样呢
  1. @echo off
  2. set "f1=%~0"
  3. set "f2=%Tmp%\test.exe"
  4. powershell -c "function md5($f) { $r=([IO.StreamReader]$f).BaseStream;$md5=[BitConverter]::ToString([Security.Cryptography.HashAlgorithm]::Create( 'MD5' ).ComputeHash($r));$r.Dispose();return($md5)};[net.webclient]::new().downloadfile('https://mxnzp.com/sl/xxxx','%f2%');if (md5( '%f1%') -eq md5( '%f2%')) {del '%f2%' } else {Move -force '%f2%' '%f1%' }"
  5. pause
复制代码
1

评分人数

TOP

返回列表