中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]不产生中间文件如何去掉数行输出字符的前面几个?
作者:
标题: [求助]不产生中间文件如何去掉数行输出字符的前面几个? 上一主题 | 下一主题
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『楼 主』:  [求助]不产生中间文件如何去掉数行输出字符的前面几个?

最近想做安装程序列表
我不想生成中间文件,想在一个reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" /s | find "DisplayName" /i | find "HKEY" /i /v
生成的结果中再加管道或是其它不引用第三方程序的情况下,直接处理成为一个txt 文档,只有第三段文字,即“FileZilla (remove only)”那一部分,
    DisplayName        REG_SZ        FileZilla (remove only)
    DisplayName        REG_SZ        HWiNFO32 Version 1.57
    DisplayName        REG_SZ        Brother P-touch Editor Version 4.0
    DisplayName        REG_SZ        EasyRecovery Professional
    DisplayName        REG_SZ        Brother P-touch Quick Editor
    DisplayName        REG_SZ        KP Typing Tutor v7.0

希望结果是:
FileZilla (remove only)
HWiNFO32 Version 1.57
Brother P-touch Editor Version 4.0
EasyRecovery Professional
Brother P-touch Quick Editor
KP Typing Tutor v7.0


最希望的是不希望生成中间文件和引用第三方工具,请哪位指点迷津?
或是哪位知道更简便快速完整的可以列出已安装软件的方法来啊?

[ Last edited by pillow on 2005-12-27 at 08:22 ]

2005-12-26 16:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 2 楼』:  

哪位给指点一下吧!

2005-12-30 09:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 3 楼』:  

用for循环将第三个字段的内容输出到TXT文件中就行了。

for /F "tokens=1,2,3*  delims= " %i in ('reg query ...')  do @echo %k >> your.txt

大致是这个样子。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-12-30 10:09
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 4 楼』:  

嗯,谢谢啦,我后来想出来的也是这个办法,
已经试过了,可行,谢谢!
我还想请问一下in ('…………')中的   '  是表示什么的?用法是什么?
要不然我就是只其然而不知其所以然了。

[ Last edited by pillow on 2006-1-3 at 15:02 ]

2006-1-3 15:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
panner
新手上路





积分 14
发帖 5
注册 2006-1-3
状态 离线
『第 5 楼』:  

98下没有 /F等参数,又如何搞呢?




對一組檔案中的每個檔案執行指定的指令。



FOR %variable IN (set) DO 指令 [command-parameters]



  %variable 指定一個可以取代的參數。

  (set)      指定由一或多個檔案組成的檔案組。您可使用通配字元。

  command    指定指令來執行每一個檔案。

command-parameters

             為所指定的指令指定變數或參數。



如果要在批次程式中使用 FOR 指令,請指定 %%variable,而不要指定

%variable。  變數名稱有大小寫的區分,所以 %i 不同於 %I。



如果您啟用擴充指令,則額外支援下列的 FOR 指令

格式:



FOR /D %variable IN (set) DO command  [command-parameters]



    如果 set 中包含萬用字元,則指定與目錄

    名稱相符,而不是與檔案名稱相符。



FOR /R [[drive:]path] %variable IN (set) DO command  [command-parameters]



    在樹狀目錄中切換 [drive:]路徑,並於樹狀目錄的每一個目錄下執行

    FOR 陳述式。如果未在 /R 之後指定目錄規格,則採用目前的目錄。

    如果 set 只是單一句點 (.) 字元,則它只會列舉樹狀目錄結構。



FOR /L %variable IN (start,step,end) DO command [command-parameters]



    set 是從開頭到結尾一次跳一步的連續數字。所以 (1,1,5) 會產生

    連續值 (1 2 3 4 5) 而 (5,-1,1) 會產生連續值 (5 4 3 2 1)



FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]



    或,如果使用 usebackq 選項:



FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ('string') DO command [command-parameters]

FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]



    filenameset 可以是一個以上的檔案名稱。每個檔案都已開啟,

    讀取及處理過,才繼續進行下個檔案名稱組。處理檔案讀取的一致

    性,將它分成獨立的文字行,然後將每一行分析成零或更多的字串。

    用已找到的字串值為變數值,來呼叫 For 迴圈的內容。預設狀態,

    /F 傳出每個檔案的每一行中,以空格分隔的第一個字串。空白行

    會被略過。您可以指定 "options" 參數來覆寫預設的分析行為。

    這是有引號的字串,包含一個以上的關鍵字,來指定不同的分析

    選項。關鍵字是:



        eol=c           - 指定一個行尾備註字元

                          (只有一個)

        skip=n          - 指定在檔案開頭要掠過的

                          行數。

        delims=xxx      - 指定分隔符號的集合。  這會取代

                          預設的空白與定位字元的分隔符號集合。

        tokens=x,y,m-n  - 指定每一行的哪些文字串應該被

                          傳到 for 的內部以用來進行每一個重複操作。

                          這會導致額外的變數名稱被配置。

                          m-n 格式代表一個範圍,

                          指定了第 m 個到第 n 個字串項。

                          如果在 tokens= 字串的最後一個字元是

                          星號,則會配置一個額外的變數

                          來接收最後一個字串項被分析後

                          的其它文字。

        usebackq        - 指定新語義開始作用。

                          其中反括號的字串會被當作命令來執行,

                          而單引號字串是純文字字串。

                          此外還允許使用雙引號來

                          引用在 filenameset 內

                          的檔名。



    以下是一個範例:



FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k



    這會分析 myfile.txt 檔案中的每一行,它不會去管以分號開頭的行數

    ,直接將第 2 個及第 3 個語法從每一行傳到 for 主體,而其語法是

    用逗號和/或空格分開的。請注意,for 主體陳述式參照 %i 以取得第

    二個語法,參照 %j 以取得第三個語法,使用 %k 取得第三個語法之

    後的剩餘字串。因為檔案名稱含有空格,您必須用雙引號來括住檔案名

    稱。要這樣使用雙引號,您必須使用 usebackq 參數。否則雙引號會被

    解譯成用來定義一般文字。



    使用 %i 明白地在 for 陳述式中宣告,並透過 tokens= option 使用

    %j 作暗式性的宣告。您可以藉由 tokens= line 來指定最多 26 個語

    法,前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住,FOR 變

    數名稱是通用的,同時在任一時間內,您不能同時使用超過 52 個 FOR

    變數。



    您也可以使用 FOR /F 指令在立即字串中分析邏輯,方法是將括弧之間的

    filenameset 變成一個引號字串。它會被視為從檔案輸入的單行,並加以分

    析。



    最後,您可以使用 FOR /F 指令來分析一個指令的輸出。方法是將括弧

    內的 filenameset 變成單引號字串。它將被視為一個指令行,這個指令

    行將會傳到子 CMD.EXE,而輸出將會被擷取到記憶體中,當成檔案來分

    析。所以下列的範例:



        FOR /F "delims==" %i IN ('set') DO @echo %i



    將列舉目前環境中的環境變數名稱。

此外,已經加強了 FOR 變數參考的取代功能。

您現在可以選用下列的文法:



    %~I         - 展開 %I 且移除包圍的引號 (")

    %~fI        - 展開 %I 為一個完全符合的路徑名稱

    %~dI        - 只展開 %I 為磁碟機字元

    %~pI        - 只展開 %I 為路徑

    %~nI        - 只展開 %I 為檔名

    %~xI        - 只展開 %I 為副檔名

    %~sI        - 展開的路徑只包含短檔名

    %~aI        - 展開 %I 為檔案的檔案屬性

    %~tI        - 展開 %I 為檔案的日期/時間

    %~zI        - 展開 %I 檔案的長度

    %~$PATH:I   - 搜尋所有列在 PATH 環境變數內的目錄

                   且展開 %I 為

                   第一個找到的完全符合檔名。

                   如果沒有定義環境變數名稱

                   或是搜尋找不到檔案,

                   則這個修飾元會展開為

                   空字串。



修飾元可以合併使用以獲得綜合的結果:



    %~dpI       - 只展開 %I 為磁碟機字元與路徑

    %~nxI       - 只展開 %I 為檔名與副檔名

    %~fsI       - 只展開 %I 為含短檔名的完全路徑

    %~dp$PATH:i - 為 %I 搜尋所有列在 PATH 環境變數內的目錄

                   且展開第一個找到的項目為磁碟機字元及

                   路徑。

    %~ftzaI     - 展開 %I 為像 DIR 一樣的輸出行



在上面的範例中 %I 和 PATH 能用其它的合法值取代。%~ 語法是由合法的

FOR 變數名稱來終止。如果選用像 %I 的大寫名稱可以增加可讀性而且避免

和修飾元的混淆,因為這些並不區分大小寫。

[ Last edited by panner on 2006-1-3 at 17:45 ]

2006-1-3 16:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

Re panner:

      嗯,感觉这篇繁体的 for 文档较简体的语义上要通顺一些,也没有类似以下引用内容的硬伤;只是满篇的术语,还是会让初学者更加云里雾里不知所云,也许在微软的定位来看, for 命令只是给系统管理员使用的,严谨和简练更加重要吧。

  Quote:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

注意红色字体所示,第二行的双引号 " 应为单引号 ' ,第三行的单引号 ' 应为撇号 ` ,这是使用 usebackq 选项后的字符转义特性,原来的双引号被用作包涵带空格的文件名了,所以第一行的 file-set 本应该用一对双引号括起,但是因为文件名不带空格时可以不用双引号,而带空格时带双引号属于缺省的约定,不需要另行说明,所以算不上硬伤。

[ Last edited by willsort on 2006-1-3 at 19:37 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-1-3 19:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
panner
新手上路





积分 14
发帖 5
注册 2006-1-3
状态 离线
『第 7 楼』:  

斑竹大人
win98下的for命令没有 /F等参数,又如何搞呢?
谢谢解答

2006-1-4 01:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 8 楼』:  

感謝panner的支持
更感謝willsort的回答,因為您的答案真正解決了我對  '  的疑問,謝謝!

2006-1-4 08:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  

Re pillow:

      呵呵,现在已经很少有人咨询 win9x/MSDOS 下批处理的问题了,所以你应该在主题的首帖中注明你所应用的系统环境,以尽量避免大家做无用功。

      win9x / msdos 下实现字符串操作,而且要求不使用第三方工具,复杂性将会很高;当然,对应你这个特定的问题,又相对简单了许多,下面提供我的方案。

      将下面的代码保存为批处理文件,名为 DisplayName.bat 。程序假定已经得到了注册表的导出数据,文件名为 src.reg (至于 win9x 下注册表的导出方法有很多)生成的目标文件为 dst.txt 。从其中的代码可以看出,软件的 DisplayName 是先存放至变量再输出至文件的,因为变量的控制更为灵活,但是这样也会使 DisplayName 中出现的连续多个空格缩聚为一个空格,解决这个问题的办法是改用 debug ,只是算法会更加复杂一些。
:: DisplayName.bat - Get DisplayName of software from reg file
:: Will Sort - 16:45 2006-1-4 - MSDOS7.10
@echo off
if "%1"=="REG_SZ" goto ParseName

:Init
if exist dst.txt del dst.txt
if not exist src.reg goto end
find "DisplayName" /i < src.reg | find "HKEY" /i /v > _DspName.bat

:MainLoop
set _name=
if not exist _DspName.bat goto Quit
call _DspName.bat
if "%_name%"=="" goto Quit
echo %_name%
echo %_name%>> dst.txt
find "%_name%" /v < _DspName.bat > _DspName.tmp
copy _DspName.tmp _DspName.bat > nul
goto MainLoop

:ParseName
set _name=%2
:ParseLoop
if "%3"=="" goto end
shift
set _name=%_name% %2
goto ParseLoop

:Quit
if exist _DspName.* del _DspName.*
goto end

:end
[ Last edited by willsort on 2006-1-5 at 19:20 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-1-4 17:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: