中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-01 22:15
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎样判断机器里是否已经安装了某个软件? 查看 1,249 回复 7
楼 主 怎样判断机器里是否已经安装了某个软件? 发表于 2006-07-18 15:13 ·  IANA 局域网IP(Private-Use)
初级用户
积分 46
发帖 13
注册 2006-06-30 10:16
20年会员
UID 57780
性别 女
状态 离线
大家好:
(在实践中学习真是一种乐趣. 感言)
个人做了一个小程序A,但需要另一个软件B的配合才行. 程序A和B都放在u盘里.
所谓的配合就是指B程序只需在一台机器上安装一次即可,下次启用A程序时就不再需再安装B了.(机器环境为win..系统.)
现在的想法就是:一个批处理首先先判断一下机器中B软件安装了没有,安装了则调用程序A,若没有则安装B,然后再调用A.(一般情况下第一次使用大多都是要安装B的)
曾经想过在u盘中作个文件,其实就是起标识符的作用:安装了B后就创建一个文件.然后每次启动批处理,就以这个文件存不存在作为判断的依据.但是在换了一台机器使用的情况下,就会出现误判断.
谢谢大家.!
请多指教.
2 发表于 2006-07-18 18:17 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  请问B程序是强制安装在固定位置吗?如果是这样的话,那就好办得多;如果是可以指定任意位置,则会耗费大量的搜索时间。

  假设是在固定位置:

@echo off
if exist "位置\程序B" "位置\程序A" else "位置\程序B的安装程序.exe" && goto continue
exit

:continue
echo 如果程序B已经安装完毕,请按任意键调用程序A
pause
"位置\程序A"


  假设程序B安装在可选位置:

@echo off
:: 此代码会耗费大量时间,请耐心等待
setlocal enabledelayedexpansion
set exclude=
set /p exclude=请输入U盘所在位置的盘符字母:
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
if exist %%a:\nul (
if "%%a"=="!exclude!" "位置\程序B的安装程序.exe" && goto continue
for /f "delims=" %%A in ('dir /a /s /b %%a:\ 程序B') do if exist "位置\程序B" "位置\程序A" else "位置\程序B的安装程序.exe" && goto continue
)
)
exit

:continue
echo 如果程序B已经安装完毕,请按任意键调用程序A
pause
"位置\程序A"


[ Last edited by namejm on 2006-7-19 at 13:25 ]
3 发表于 2006-07-19 09:21 ·  IANA 局域网IP(Private-Use)
初级用户
积分 46
发帖 13
注册 2006-06-30 10:16
20年会员
UID 57780
性别 女
状态 离线
我的神啊~~真牛

苦学中...谢谢
4 发表于 2006-07-19 09:41 ·  IANA 局域网IP(Private-Use)
初级用户
积分 46
发帖 13
注册 2006-06-30 10:16
20年会员
UID 57780
性别 女
状态 离线
还好是固定位置...:lol:
5 发表于 2006-07-19 13:24 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  今天发现2楼的第二个代码有一处错误,将导致代码出错,具体是set enabledelayedexpansion这一句中,误把setlocal写成了set了,现已经更正,请重新测试。
6 发表于 2006-07-19 13:45 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re namejm:

其实标记不一定要在安装文件夹下的,可以在注册表的固定键值下,也可以在应用软件的共享目录下(比如CommonProgramFiles),这样判定起来会简单的多。如果想增加这种方法的安全性,可以将标记设定为一个指出程序安装路径和安装文件的数据或程序文件,以方便进行本地化的存在性判定。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
7 发表于 2006-07-19 14:59 ·  中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
Re willsort:

  好久不见老大现身了:)

  是不是所有安装好的程序都会出现在注册表的固定位置或者是应用软件的共享目录下?对注册表和应用程序的共享目录不是很熟悉,请老大详细说明一下。
8 发表于 2006-07-19 16:30 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
利用注册表判断是否安装谷歌工具条2例

@echo off
reg query "HKLM\SOFTWARE\google">nul
if not errorlevel 1 echo 你的电脑上已经安装谷歌工具条!
if errorlevel 1 echo 你的电脑上没有安装谷歌工具条?
PAUSE >NUL

或者:

@echo off
reg query "HKLM\SOFTWARE"|find /i "google"
if not errorlevel 1 echo 你的电脑上已经安装谷歌工具条!
if errorlevel 1 echo 你的电脑上没有安装谷歌工具条?
PAUSE >NUL
论坛跳转: