无忧启动论坛

标题: 单文件制作中32、64位判别批处理的四步进化 [打印本页]

作者: 苏州本是    时间: 2016-5-4 10:27
标题: 单文件制作中32、64位判别批处理的四步进化
单文件执行文件的制作过程中常常会涉及到32位、64位判别批处理,通常你会看到下面这个版本:
@echo off
color 0a
if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "x86" goto x86
Dism++\Dism++x64.exe
exit
:x86
Dism++\Dism++x86.exe
exit

上面这种代码如果碰到路径长的情况,会显得啰嗦。其实可以设置环境变量来避免:
@echo off
color 0a
set bits=x86
if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "x86" goto x86
set bits=x64
:x86
Dism++\Dism++%bits%.exe
set bits=
exit

上面两种代码都用到了跳转,其实也可以避免(关键代码仅四行!):
@echo off
color 0a
set bits=x64
if "%PROCESSOR_IDENTIFIER:~0,3%"=="x86" set bits=x86
Dism++\Dism++%bits%.exe
set bits=
exit

上面两种代码用了两次set bits,可以简化到一次(关键代码仅三行!):
@echo off
color 0a
set bits=%PROCESSOR_IDENTIFIER:~0,3%
Dism++\Dism++%bits%.exe
set bits=
exit

其实,不用判别、不用另设set bits,也可以实现,下面是终极模式(关键代码仅一行!):
@echo off
color 0a
Dism++\Dism++%PROCESSOR_IDENTIFIER:~0,3%.exe
exit

还有两点需要说明,一是上面的路径是相对路径,也可以采用绝对路径,如D:\Tools\Dism++\Dism++%PROCESSOR_IDENTIFIER:~0,3%.exe。二是有的软件32位、64位软件分目录存储,这时可以用环境变量作目录名,如果目录名是x86和x64,可以直接用%PROCESSOR_IDENTIFIER:~0,3%作目录名,例如backup\%PROCESSOR_IDENTIFIER:~0,3%\imagex.exe;如果目录名是86和64或32和64或其它情况,都可以用到if判别位数和设set bits=具体的名称。具体情况可变通使用上述方法。我啰嗦了。
作者: 窄口牛    时间: 2016-5-4 11:30
赞一个
作者: 2012雨晨绿软    时间: 2016-5-4 11:35
Dism++\Dism++%PROCESSOR_IDENTIFIER:~0,3%.exe |Dism++\Dism++x64.exe
作者: 苏州本是    时间: 2016-5-4 12:19
%PROCESSOR_IDENTIFIER:~0,3%的值随系统的位别而异=x86|x64
作者: devilma    时间: 2016-5-4 16:50
不错~学习了……
作者: devilma    时间: 2016-5-4 16:50
不错~学习了……
作者: 2012雨晨绿软    时间: 2016-5-4 17:28
本帖最后由 2012雨晨绿软 于 2016-5-4 17:30 编辑
苏州本是 发表于 2016-5-4 12:19
%PROCESSOR_IDENTIFIER:~0,3%的值随系统的位别而异=x86|x64


你可以在CMD中看一下X64 显示是AMD
作者: 2012雨晨绿软    时间: 2016-5-4 17:53
本帖最后由 2012雨晨绿软 于 2016-5-4 17:55 编辑



本来我是不用这个工具的,为了让楼主见到真相特意下载测试
作者: 2012ss06009180    时间: 2016-5-4 18:48
经测试无效

作者: 2012雨晨绿软    时间: 2016-5-4 18:59
2012ss06009180 发表于 2016-5-4 18:48
经测试无效

你是平板吧?
作者: 2012ss06009180    时间: 2016-5-4 19:02
2012雨晨绿软 发表于 2016-5-4 18:59
你是平板吧?

有触屏,但不能说是平板。
作者: nttwqz    时间: 2016-5-6 22:52
1. %PROCESSOR_IDENTIFIER:~0,3%用来判断系统是x86还是x64本身就不准确,不信看图。建议使用%PROCESSOR_ARCHITECTURE%这个变量,因为微软就是这么用的,参见AIK及其他工具的脚本。


2. 一行代码就可以解决。
  1. if /i %PROCESSOR_ARCHITECTURE% EQU x86 (notepad.exe) else (regedit.exe)
复制代码


3. 微软AIK中的用法。
  1. if /i %PROCESSOR_ARCHITECTURE% EQU X86 echo    %~dp0..\%PROCESSOR_ARCHITECTURE%
  2. if /i %PROCESSOR_ARCHITECTURE% NEQ X86 echo    %~dp0..\%PROCESSOR_ARCHITECTURE%;%~dp0..\x86
复制代码

作者: 12250279    时间: 2016-5-8 08:45
这个绝对要支持啊,
作者: ku588    时间: 2016-5-8 09:06
本帖最后由 ku588 于 2016-5-8 09:27 编辑

以上代码都不太可靠,尤其是认为不是X86的都是64位,如下面代码:
@echo off
color 0a
if /i "%PROCESSOR_IDENTIFIER:~0,3%" == "x86" goto x86
Dism++\Dism++x64.exe
exit
:x86
Dism++\Dism++x86.exe
exit

在一些精简过度的PE下使用会识别错误!你不能总认为你的单文件只能在正常系统下才能正常使用吧!

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

有兴趣的试试这个:




x86_x64_cmd.7z

248 Bytes, 下载次数: 46, 下载积分: 无忧币 -2


作者: nttwqz    时间: 2016-5-8 11:34
ku588 发表于 2016-5-8 09:06
以上代码都不太可靠,尤其是认为不是X86的都是64位,如下面代码:
@echo off
color 0a
尤其是认为不是X86的都是64位


严格来说的确不够严谨,至少我自己用还是分开识别的。

不过,我读书少,要不你找个非X86又不是AMD64的WinPE,然后推荐些非X86又不是AMD64的软件,比如无损分区工具,硬盘S.M.A.R.T信息查看工具,低格和坏道修复工具,让俺也长长见识……
作者: bhdc    时间: 2016-5-8 13:49
根本用不着批处理判断,打包时设置运行参数就行了。
作者: bhdc    时间: 2016-5-8 13:53
http://www.bathome.net/thread-30883-1-1.html

%PROCESSOR_ARCHITECTURE%也是不准确的。
作者: nttwqz    时间: 2016-5-8 15:01
bhdc 发表于 2016-5-8 13:53
http://www.bathome.net/thread-30883-1-1.html

%PROCESSOR_ARCHITECTURE%也是不准确的。

看来还是if exist %windir%\SysWOW64来的省事儿,不用记复杂的变量名……
作者: 1400700226    时间: 2016-5-14 14:28
nttwqz 发表于 2016-5-8 15:01
看来还是if exist %windir%\SysWOW64来的省事儿,不用记复杂的变量名……

有些PE精简掉了SysWOW64。。。

03PE貌似没有%PROCESSOR_ARCHITECTURE%变量。。。

头大,求高人
作者: nttwqz    时间: 2016-5-15 22:41
1400700226 发表于 2016-5-14 14:28
有些PE精简掉了SysWOW64。。。

03PE貌似没有%PROCESSOR_ARCHITECTURE%变量。。。

那就干脆自己弄好,PE什么版本就用什么版本,否则,确认文件或者文件夹是否存在,可能被精简掉了,查询特定注册表键值,可能精简掉了。系统变量,可能没有。而且有的PE一些命令都精简掉了……
作者: guies    时间: 2016-5-16 10:46
echo "%PROCESSOR_IDENTIFIER:~0,3%"
"Int"
echo "%PROCESSOR_IDENTIFIER:~0,30%"
"Intel64 Family 6 Model 60 Step"

我之前也是在用 %PROCESSOR_IDENTIFIER% 變量,可是 Windows 10 又改變了,微軟幹嘛變來變去的。
作者: 1400700226    时间: 2016-5-16 12:01
nttwqz 发表于 2016-5-15 22:41
那就干脆自己弄好,PE什么版本就用什么版本,否则,确认文件或者文件夹是否存在,可能被精简掉了,查询特 ...

对啊。。。甚是头大。。。
作者: nttwqz    时间: 2016-5-16 14:04
1400700226 发表于 2016-5-16 12:01
对啊。。。甚是头大。。。

想到了一个方法。

从正常 Win8.1 x64 系统(也可以是Win7 x64)复制出下面的文件备用。

  1. %windir%\System32\help.exe
  2. %windir%\System32\zh-CN\help.exe.mui
复制代码


如下放置上面的两个文件
  1. osarch\help.exe
  2. osarch\zh-CN\help.exe.mui
复制代码


判断系统类型的脚本

  1. @echo off
  2. pushd %~dp0
  3. %cd%\osarch\help.exe >nul 2>nul
  4. if %errorlevel%==1 (echo 64位系统) else (echo 32位系统)
  5. pause
复制代码



在Win7 32位PE及Win8x64不带help.exe及help.exe.mui的PE中试了,可行。
32位自解压及64位自解压均可正常判断。

此法不依赖环境变量、注册表及文件,应该是正常的PE都可以判断(即使没有桌面),两个文件只有20K。相信不会有哪个PE精简到连命令行帮助help.exe都不能运行吧?

作者: 1400700226    时间: 2016-5-16 15:45
nttwqz 发表于 2016-5-16 14:04
想到了一个方法。

从正常 Win8.1 x64 系统(也可以是Win7 x64)复制出下面的文件备用。

03PE咋办?
作者: nttwqz    时间: 2016-5-16 20:17
1400700226 发表于 2016-5-16 15:45
03PE咋办?

我早都放弃03PE 了,对于只有03PE能用的老古董,我们都不修。手边也没有,只有老毛桃070911。

  1. @echo off
  2. pushd %~dp0
  3. ver | find "5.1" && goto xp
  4. %cd%\osarch\help.exe >nul 2>nul
  5. if %errorlevel%==1 (echo 64位系统) else (echo 32位系统)
  6. pause

  7. :xp
  8. --------命令--------
复制代码



作者: 1400700226    时间: 2016-5-16 20:26
nttwqz 发表于 2016-5-16 20:17
我早都放弃03PE 了,对于只有03PE能用的老古董,我们都不修。手边也没有,只有老毛桃070911。

呃。。。。学习了
作者: nttwqz    时间: 2016-5-16 20:30
1400700226 发表于 2016-5-16 20:26
呃。。。。学习了

相信这年代不会有人用64位的03PE,所以,只要判断出版本号,跳过去其它判断步奏就可以了……哈哈
作者: 1400700226    时间: 2016-5-16 20:48
nttwqz 发表于 2016-5-16 20:30
相信这年代不会有人用64位的03PE,所以,只要判断出版本号,跳过去其它判断步奏就可以了……哈哈

呃。。。我完美主义。 。。呃呃
作者: icevan    时间: 2016-5-17 23:48
要想在复杂环境中使用,肯定需要很多判断。
判断版本号我原来用的
for /f "tokens=2 delims=[" %%i in ('ver') do (set ver=%%i)
if %ver:~3,3% lss 6 (
      goto nt5
) else (
      goto nt6
)
然后在判断系统位宽。
作者: klth    时间: 2016-5-19 10:46
谢谢!楼主提供!好样的
作者: leono    时间: 2016-11-17 15:48
本帖最后由 leono 于 2016-11-17 15:50 编辑
icevan 发表于 2016-5-17 23:48
要想在复杂环境中使用,肯定需要很多判断。
判断版本号我原来用的
for /f "tokens=2 delims=[" %%i in (' ...


这种写法也是错误的
cmd里面不同位数比较,10 lss 6 正确,你的判断就出错了
更别说CMD不支持小数运算了,当然你一定要比较可以做小数点处理或者调用vbs算法

另外%ver:~3,3%也有问题,中文版本可以,换其他语言版本就错了,正确应该是以空格截取,而不是字符位数
作者: icevan    时间: 2017-12-16 17:40
leono 发表于 2016-11-17 15:48
这种写法也是错误的
cmd里面不同位数比较,10 lss 6 正确,你的判断就出错了
更别说CMD不支持小数运 ...

谢谢提醒,看来截取的值不能带小数点。

还有变量截取的地方,这个地方我只看到按字符位数截取的方法,、难道你是说用for命令?
其他语言的版本这个变量截取方法又是那一种?
作者: wynew8au    时间: 2017-12-25 11:16
我也来一个CMD判断系统位数
CMD判断系统是32位或64位.rar (26.25 KB, 下载次数: 13)



作者: 苏州本是    时间: 2017-12-25 17:26
wynew8au 发表于 2017-12-25 11:16
我也来一个CMD判断系统位数

你这是用了小程序了。
作者: lintrainwy    时间: 2017-12-25 17:35
判断 64/32位 系统&程序 正确导入64/32位DLL 批处理

  1. rem 判断64/32位系统,四种方法
  2. ::set "OSbit=32" &wmic os get OSArchitecture|find "64">nul 2>&1 && set "OSbit=64"
  3. ::set "OSbit=32" &reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE|find "64">nul 2>&1 && set "OSbit=64"
  4. ::set "OSbit=32" &dir %windir%|find "SysWOW64"        >nul 2>&1 && set "OSbit=64"
  5. set "OSbit=32" &if defined programw6432 set "OSbit=64"

  6. rem 判断64/32位程序
  7. set "exebit=32" &echo %processor_architecture% |find "64">nul 2>&1 && set "exebit=64"

  8. echo %exebit% 位程序运行在 %OSbit% 位操作系统上
  9. pause
复制代码





欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3