中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-07 08:45
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助] 如何将命令行输出的某些行赋值于变量? 查看 1,362 回复 13
楼 主 [求助] 如何将命令行输出的某些行赋值于变量? 发表于 2008-01-17 04:27 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
使用命令行
DEVCON FIND USB\*

显示出如下信息:
USB\ROOT_HUB\4&1A8F66BB&0 : USB Root Hub
USB\ROOT_HUB\4&2D491760&0 : USB Root Hub
USB\ROOT_HUB\4&467FDFE&0 : USB Root Hub
USB\ROOT_HUB\4&7D5B616&0 : USB Root Hub
USB\ROOT_HUB20\4&2556A5A7&0 : USB Root Hub
USB\VID_04A9&PID_106A\408Q9I : USB Printing Support
USB\VID_0A81&PID_0205\5&11CCBFD0&0&2 : USB Composite Device
USB\VID_0A81&PID_0205&MI_00\6&DE85D78&0&0000 : USB USB\VID_0A81&PID_0205&MI_01\6&DE85D78&0&0001 : USB USB\VID_0AC8&PID_307B\5&39E0BBF6&0&2 : USB PC Camera (ZS0211)
USB\VID_1130&PID_F211\5&11CCBFD0&0&1 : USB Composite Device
USB\VID_1130&PID_F211&MI_00\6&2BDBF2D1&0&0000 : USB Audio Device
USB\VID_1130&PID_F211&MI_03\6&2BDBF2D1&0&0003 : USB USB\VID_1130&PID_F211&MI_04\6&2BDBF2D1&0&0004 : USB 14 matching device(s) found.


请问如何提取这两行:
USB\VID_0A81&PID_0205\5&11CCBFD0&0&2 : USB Composite Device
USB\VID_1130&PID_F211\5&11CCBFD0&0&1 : USB Composite Device

然后赋值给变量 A 和 B ?
set A=VID_0A81&PID_0205
set B=VID_1130&PID_F211


请尽量不使用过渡文件,谢谢!

[ Last edited by chishingchan on 2008-1-17 at 04:52 AM ]
2 发表于 2008-01-17 13:17 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
3 发表于 2008-01-17 22:40 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
Originally posted by fastslz at 2008-1-17 01:17 PM:
http://www.cn-dos.net/forum/viewthread.php?tid=34906&fpage=1
『第 5 楼』:

http://www.cn-dos.net/forum/viewthread.php?tid=37059&fpage=2
http://www.cn-d ... 对 DEVCON 又长见识了,谢谢!不过好像不对题啊!? 我觉得此问题只是FOR的应用不够理解而已:是两个变量赋值,单个变量赋值我是会的,两个以上我就不太会.请不要再贴些让我学习的贴子,难道帮忙列个命令行就那么难吗?
4 发表于 2008-01-18 11:57 ·  中国 浙江 温州 乐清市 电信
初级用户
★★
积分 109
发帖 52
注册 2006-01-03 22:47
20年会员
UID 48392
状态 离线
只有2个变量的话,可以这么办:

DEVCON FIND USB\*>ininin.txt
for /f "tokens=2 delims=\\" %%A in ('type ininin.txt^|findstr Composite') do set B="%%A"
for /f "tokens=2 delims=\\" %%A in ('type ininin.txt^|findstr Composite^|findstr ^/V %B% ') do set A="%%A"
echo %A%
echo %B%
pause

编辑:楼主自行把生成临时文件的重定向给取消吧。这里只是提供一个思路。如果是3个或以上变量,可以依照这个思路再往下写。当然这个办法是比较笨一些了。

[ Last edited by dooomer on 2008-1-18 at 12:03 PM ]
5 发表于 2008-01-18 15:40 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
Originally posted by dooomer at 2008-1-18 11:57 AM:
只有2个变量的话,可以这么办:

DEVCON FIND USB\*>ininin.txt
for /f "tokens=2 delims=\\" %%A in ('type ininin.txt^|findstr Composite') do set B="%%A"
for /f ...


谢谢!符合题意!

以上代码改成如下:

@echo off
for /f "tokens=2 delims=\\" %%A in ('DEVCON FIND USB\* ^|findstr Composite') do set B="%%A"
for /f "tokens=2 delims=\\" %%A in ('DEVCON FIND USB\* ^|findstr Composite^|findstr ^/V %B%') do set A="%%A"
echo %A%
echo %B%
pause


显示结果:
"VID_0A81&PID_0205"
"VID_1130&PID_F211"
请按任意键继续. . .


请问如何取消变量值的两侧冒号?
6 发表于 2008-01-18 16:08 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
@echo off
for /f "tokens=1,2 delims=\" %%i in ('devcon find usb\*^|find /i "Composite Device"') do call :xxx "%%i\%%j"
echo "%A%" "%B%"
pause

:xxx
if "%~1"=="" goto:eof
if "%A%"=="" (set "A=%~1") else (set "B=%~1")
goto:eof
第一高手 第二高手

7 发表于 2008-01-18 16:38 ·  中国 浙江 温州 乐清市 电信
初级用户
★★
积分 109
发帖 52
注册 2006-01-03 22:47
20年会员
UID 48392
状态 离线
楼主不用研究我那个笨法子了,楼上高手出手了。我先学习学习。

编辑:楼上能否给讲讲call后面两个参数中间的“\”的作用?不知哪里能找到相关资料呢?

[ Last edited by dooomer on 2008-1-18 at 04:45 PM ]
8 发表于 2008-01-18 18:21 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
那个“\”要取决于for tokens=1,2 delims=\参数而定
第一高手 第二高手

9 发表于 2008-01-19 12:30 ·  中国 浙江 温州 乐清市 电信
初级用户
★★
积分 109
发帖 52
注册 2006-01-03 22:47
20年会员
UID 48392
状态 离线
谢谢,我再仔细看看for的帮助。
10 发表于 2008-01-19 18:36 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
以下代码算是可以了。谢谢以上各位的解答!

@echo off
for /f "tokens=3,5 delims=\_&" %%a in ('DEVCON FIND HID\* ^|FIND "Keyboard"') do set var=%%a%%b
echo %var%
PAUSE


显示结果:
0A810205
请按任意键继续. . .

我的意思是找出USB to PS2 x 2 的代码值回写到某个文件内的(破解BeTwin拖机软件用),请问有没有这样的工具可以写入代码到某个文件内的(CMD环境)?
11 发表于 2008-01-21 00:02 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
找到一个工具是:change

但不知格式如何,因为按照说明例子列出命令行时,还是提示手工输入参数。
12 发表于 2008-01-21 00:59 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
我不了解BeTwin,说明下要求吧
如果是USB鼠标你可以devcon find USB\Class_03\*
第一高手 第二高手

13 发表于 2008-01-21 22:16 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
其实就是找一个支持16进制代码改写二进制文件的一个能够运行在CMD环境下的命令行工具!

只是个例子:hexc filename.exe "04B48328" "0A810205"

hexc 好像不支持cmd

[ Last edited by chishingchan on 2008-1-21 at 10:21 PM ]
14 发表于 2008-01-26 11:43 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,284
发帖 538
注册 2002-11-02 00:00
23年会员
UID 129
性别 男
状态 离线
请问这种工具谁能提供一下呀?都很久了,怎么没人理?
论坛跳转: