无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 8070|回复: 41
打印 上一主题 下一主题

[分享] 单文件制作中32、64位判别批处理的四步进化

    [复制链接]
跳转到指定楼层
#
发表于 2016-5-4 10:27:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
单文件执行文件的制作过程中常常会涉及到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=具体的名称。具体情况可变通使用上述方法。我啰嗦了。
34#
发表于 2017-12-25 17:35:23 | 只看该作者
判断 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
复制代码
回复

使用道具 举报

33#
 楼主| 发表于 2017-12-25 17:26:33 | 只看该作者
wynew8au 发表于 2017-12-25 11:16
我也来一个CMD判断系统位数

你这是用了小程序了。
回复

使用道具 举报

32#
发表于 2017-12-25 11:16:13 | 只看该作者
我也来一个CMD判断系统位数
CMD判断系统是32位或64位.rar (26.25 KB, 下载次数: 15)


点评

你这是用了小程序了。  详情 回复 发表于 2017-12-25 17:26
回复

使用道具 举报

31#
发表于 2017-12-16 17:40:52 | 只看该作者
leono 发表于 2016-11-17 15:48
这种写法也是错误的
cmd里面不同位数比较,10 lss 6 正确,你的判断就出错了
更别说CMD不支持小数运 ...

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

还有变量截取的地方,这个地方我只看到按字符位数截取的方法,、难道你是说用for命令?
其他语言的版本这个变量截取方法又是那一种?
回复

使用道具 举报

30#
发表于 2016-11-17 15:48:33 | 只看该作者
本帖最后由 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%也有问题,中文版本可以,换其他语言版本就错了,正确应该是以空格截取,而不是字符位数

点评

谢谢提醒,看来截取的值不能带小数点。 还有变量截取的地方,这个地方我只看到按字符位数截取的方法,、难道你是说用for命令? 其他语言的版本这个变量截取方法又是那一种?  详情 回复 发表于 2017-12-16 17:40
回复

使用道具 举报

29#
发表于 2016-5-19 10:46:38 | 只看该作者
谢谢!楼主提供!好样的
回复

使用道具 举报

28#
发表于 2016-5-17 23:48:45 | 只看该作者
要想在复杂环境中使用,肯定需要很多判断。
判断版本号我原来用的
for /f "tokens=2 delims=[" %%i in ('ver') do (set ver=%%i)
if %ver:~3,3% lss 6 (
      goto nt5
) else (
      goto nt6
)
然后在判断系统位宽。

点评

这种写法也是错误的 cmd里面不同位数比较,10 lss 6 正确,你的判断就出错了 更别说CMD不支持小数运算了,当然你一定要比较可以做小数点处理或者调用vbs算法  详情 回复 发表于 2016-11-17 15:48
回复

使用道具 举报

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

呃。。。我完美主义。 。。呃呃
回复

使用道具 举报

26#
发表于 2016-5-16 20:30:36 | 只看该作者
1400700226 发表于 2016-5-16 20:26
呃。。。。学习了

相信这年代不会有人用64位的03PE,所以,只要判断出版本号,跳过去其它判断步奏就可以了……哈哈

点评

呃。。。我完美主义。 。。呃呃  详情 回复 发表于 2016-5-16 20:48
回复

使用道具 举报

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

呃。。。。学习了

点评

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

使用道具 举报

24#
发表于 2016-5-16 20:17:20 | 只看该作者

我早都放弃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. --------命令--------
复制代码


点评

呃。。。。学习了  详情 回复 发表于 2016-5-16 20:26
回复

使用道具 举报

23#
发表于 2016-5-16 15:45:59 | 只看该作者
nttwqz 发表于 2016-5-16 14:04
想到了一个方法。

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

03PE咋办?

点评

我早都放弃03PE 了,对于只有03PE能用的老古董,我们都不修。手边也没有,只有老毛桃070911。  详情 回复 发表于 2016-5-16 20:17
回复

使用道具 举报

22#
发表于 2016-5-16 14:04:19 | 只看该作者
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都不能运行吧?

点评

03PE咋办?  详情 回复 发表于 2016-5-16 15:45
回复

使用道具 举报

21#
发表于 2016-5-16 12:01:33 | 只看该作者
nttwqz 发表于 2016-5-15 22:41
那就干脆自己弄好,PE什么版本就用什么版本,否则,确认文件或者文件夹是否存在,可能被精简掉了,查询特 ...

对啊。。。甚是头大。。。

点评

想到了一个方法。 从正常 Win8.1 x64 系统(也可以是Win7 x64)复制出下面的文件备用。 如下放置上面的两个文件 判断系统类型的脚本 在Win7 32位PE及Win8x64不带help.exe及help.exe.mui的PE  详情 回复 发表于 2016-5-16 14:04
回复

使用道具 举报

20#
发表于 2016-5-16 10:46:34 | 只看该作者
echo "%PROCESSOR_IDENTIFIER:~0,3%"
"Int"
echo "%PROCESSOR_IDENTIFIER:~0,30%"
"Intel64 Family 6 Model 60 Step"

我之前也是在用 %PROCESSOR_IDENTIFIER% 變量,可是 Windows 10 又改變了,微軟幹嘛變來變去的。
回复

使用道具 举报

19#
发表于 2016-5-15 22:41:15 | 只看该作者
1400700226 发表于 2016-5-14 14:28
有些PE精简掉了SysWOW64。。。

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

那就干脆自己弄好,PE什么版本就用什么版本,否则,确认文件或者文件夹是否存在,可能被精简掉了,查询特定注册表键值,可能精简掉了。系统变量,可能没有。而且有的PE一些命令都精简掉了……

点评

对啊。。。甚是头大。。。  详情 回复 发表于 2016-5-16 12:01
回复

使用道具 举报

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

有些PE精简掉了SysWOW64。。。

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

头大,求高人

点评

那就干脆自己弄好,PE什么版本就用什么版本,否则,确认文件或者文件夹是否存在,可能被精简掉了,查询特定注册表键值,可能精简掉了。系统变量,可能没有。而且有的PE一些命令都精简掉了……  详情 回复 发表于 2016-5-15 22:41
回复

使用道具 举报

17#
发表于 2016-5-8 15:01:24 来自手机 | 只看该作者
bhdc 发表于 2016-5-8 13:53
http://www.bathome.net/thread-30883-1-1.html

%PROCESSOR_ARCHITECTURE%也是不准确的。

看来还是if exist %windir%\SysWOW64来的省事儿,不用记复杂的变量名……

点评

有些PE精简掉了SysWOW64。。。 03PE貌似没有%PROCESSOR_ARCHITECTURE%变量。。。 头大,求高人  详情 回复 发表于 2016-5-14 14:28
回复

使用道具 举报

16#
发表于 2016-5-8 13:53:44 | 只看该作者
http://www.bathome.net/thread-30883-1-1.html

%PROCESSOR_ARCHITECTURE%也是不准确的。

点评

看来还是if exist %windir%\SysWOW64来的省事儿,不用记复杂的变量名……  详情 回复 发表于 2016-5-8 15:01
回复

使用道具 举报

15#
发表于 2016-5-8 13:49:56 | 只看该作者
根本用不着批处理判断,打包时设置运行参数就行了。
回复

使用道具 举报

14#
发表于 2016-5-8 11:34:35 来自手机 | 只看该作者
ku588 发表于 2016-5-8 09:06
以上代码都不太可靠,尤其是认为不是X86的都是64位,如下面代码:
@echo off
color 0a
尤其是认为不是X86的都是64位


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

不过,我读书少,要不你找个非X86又不是AMD64的WinPE,然后推荐些非X86又不是AMD64的软件,比如无损分区工具,硬盘S.M.A.R.T信息查看工具,低格和坏道修复工具,让俺也长长见识……

点评

%PROCESSOR_ARCHITECTURE% 变量是与程序的位数有关,而不是系统,比如32位程序调用 cmd 是32位的,%PROCESSOR_ARCHITECTURE%=X86  发表于 2017-12-25 17:40
if /i %PROCESSOR_ARCHITECTURE% EQU x86 (notepad.exe) else (regedit.exe) 你这个在使用上没有问题。我帖子红线上面示例的那个有问题!  发表于 2016-5-8 12:53
回复

使用道具 举报

13#
发表于 2016-5-8 09:06:17 | 只看该作者
本帖最后由 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, 下载次数: 49, 下载积分: 无忧币 -2

点评

严格来说的确不够严谨,至少我自己用还是分开识别的。 不过,我读书少,要不你找个非X86又不是AMD64的WinPE,然后推荐些非X86又不是AMD64的软件,比如无损分区工具,硬盘S.M.A.R.T信息查看工具,低格和坏道修  详情 回复 发表于 2016-5-8 11:34
回复

使用道具 举报

12#
发表于 2016-5-8 08:45:13 | 只看该作者
这个绝对要支持啊,
回复

使用道具 举报

11#
发表于 2016-5-6 22:52:53 | 只看该作者
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
复制代码
回复

使用道具 举报

10#
发表于 2016-5-4 19:02:56 | 只看该作者

有触屏,但不能说是平板。
回复

使用道具 举报

9#
发表于 2016-5-4 18:59:26 | 只看该作者

你是平板吧?

点评

有触屏,但不能说是平板。  详情 回复 发表于 2016-5-4 19:02
回复

使用道具 举报

8#
发表于 2016-5-4 18:48:23 | 只看该作者
经测试无效

点评

笔记本电脑:Intel64 Family 6 Model 37 Stepping 5, GenuineIntel  发表于 2017-12-25 17:38
你是平板吧?  详情 回复 发表于 2016-5-4 18:59
回复

使用道具 举报

7#
发表于 2016-5-4 17:53:27 | 只看该作者
本帖最后由 2012雨晨绿软 于 2016-5-4 17:55 编辑



本来我是不用这个工具的,为了让楼主见到真相特意下载测试
回复

使用道具 举报

6#
发表于 2016-5-4 17:28:07 | 只看该作者
本帖最后由 2012雨晨绿软 于 2016-5-4 17:30 编辑
苏州本是 发表于 2016-5-4 12:19
%PROCESSOR_IDENTIFIER:~0,3%的值随系统的位别而异=x86|x64


你可以在CMD中看一下X64 显示是AMD
回复

使用道具 举报

5#
发表于 2016-5-4 16:50:32 来自手机 | 只看该作者
不错~学习了……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-25 10:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表