- powershell "[system.net.webclient]::new().downloadfile('https://mxnzp.com/sl/xxxx','%Tmp%\test.exe')" && (
- for /f "eol=3 skip=1 delims=: tokens=2" %%x in ('certutil -hashfile "%~0" md5 ^| findstr /n ".*"') do (
- for /f "eol=3 skip=1 delims=: tokens=2" %%X in ('certutil -hashfile "%Tmp%\test.exe" md5 ^| findstr /n ".*"') do (
- if /i "%%x" neq "%%X" (
- del "%~0"
- move /y "%Tmp%\test.exe" "%~dpn0.exe"
- call "%~dpn0.exe"
- ) else (
- del "%Tmp%\test.exe"
- )
- )
- )
- )
复制代码 以上代码保存为 .cmd后会打包成 .exe程序;新旧test.exe同为 .cmd打包后的程序。新旧test.exe 的路径不一定相同
大概需要实现的过程是:双击 旧test.exe,运行时会先下载指定链接中的 新test.exe 文件,然后用哈希值进行对比,如果不相等就替换掉 旧test.exe 并运行 新test.exe;如果哈希值相等就删除掉下载下来的 新test.exe。
补充修改:- powershell "[system.net.webclient]::new().downloadfile('https://mxnzp.com/sl/xxxx','%Tmp%\test.exe')" 2>nul && (
- (
- echo for /f "eol=3 skip=1 delims=: tokens=2" %%%%x in ^('certutil -hashfile "%%~1.exe" md5 ^^^| findstr /n ".*"'^) do ^(
- echo for /f "eol=3 skip=1 delims=: tokens=2" %%%%X in ^('certutil -hashfile "%%Tmp%%\test.exe" md5 ^^^| findstr /n ".*"'^) do ^(
- echo if "%%%%x" neq "%%%%X" ^(
- echo del "%%~1.exe"
- echo move /y "%%Tmp%%\test.exe" "%%~1.exe"
- echo start "" "%%~1.exe"
- echo exit
- echo del %%0
- echo ^) else ^(
- echo del "%%Tmp%%\test.exe"
- echo exit /b
- echo ^)
- echo ^)
- echo ^)
- ) >"%Tmp%\test.bat"
- call "%Tmp%\test.bat" "%~dpn0"
- del "%Tmp%\test.bat"
- )
复制代码 转变了个思路,利用原脚本生成一个新脚本test.bat,在新脚本中进行MD5比对,检查上面代码的时候发现貌似call后面的参数"%~dpn0"无法传给新脚本的"%~1.exe",就差一点了不知道如何解决。
请问各位老师,我上面这条代码该如何修改。谢谢!
============================
经过测试,应该是.exe封包的问题,如果用.cmd直接运行没有这些问题。看来.exe封装是个大坑。算了不纠结封装这个了。 |