![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-23 14:46 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]不产生中间文件如何去掉数行输出字符的前面几个? |
| 可打印版本 3,671 / 8 |
| 第1楼 pillow | 发表于 2005-12-26 16:40 |
| 初级用户 发帖 82 积分 196 | |
|
[求助]不产生中间文件如何去掉数行输出字符的前面几个? 最近想做安装程序列表
我不想生成中间文件,想在一个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 ] |
|
| 第2楼 pillow | 发表于 2005-12-30 09:08 |
| 初级用户 发帖 82 积分 196 | |
|
哪位给指点一下吧!
|
|
| 第3楼 Climbing | 发表于 2005-12-30 10:09 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
用for循环将第三个字段的内容输出到TXT文件中就行了。
for /F "tokens=1,2,3* delims= " %i in ('reg query ...') do @echo %k >> your.txt 大致是这个样子。 |
|
| 第4楼 pillow | 发表于 2006-01-03 15:01 |
| 初级用户 发帖 82 积分 196 | |
|
嗯,谢谢啦,我后来想出来的也是这个办法,
已经试过了,可行,谢谢! 我还想请问一下in ('…………')中的 ' 是表示什么的?用法是什么? 要不然我就是只其然而不知其所以然了。 [ Last edited by pillow on 2006-1-3 at 15:02 ] |
|
| 第5楼 panner | 发表于 2006-01-03 16:22 |
| 新手上路 发帖 5 积分 14 | |
|
98下没有 /F等参数,又如何搞呢?
對一組檔案中的每個檔案執行指定的指令。 FOR %variable IN (set) DO 指令 %variable 指定一個可以取代的參數。 (set) 指定由一或多個檔案組成的檔案組。您可使用通配字元。 command 指定指令來執行每一個檔案。 command-parameters 為所指定的指令指定變數或參數。 如果要在批次程式中使用 FOR 指令,請指定 %%variable,而不要指定 %variable。 變數名稱有大小寫的區分,所以 %i 不同於 %I。 如果您啟用擴充指令,則額外支援下列的 FOR 指令 格式: FOR /D %variable IN (set) DO command 如果 set 中包含萬用字元,則指定與目錄 名稱相符,而不是與檔案名稱相符。 FOR /R path] %variable IN (set) DO command 在樹狀目錄中切換 路徑,並於樹狀目錄的每一個目錄下執行 FOR 陳述式。如果未在 /R 之後指定目錄規格,則採用目前的目錄。 如果 set 只是單一句點 (.) 字元,則它只會列舉樹狀目錄結構。 FOR /L %variable IN (start,step,end) DO command set 是從開頭到結尾一次跳一步的連續數字。所以 (1,1,5) 會產生 連續值 (1 2 3 4 5) 而 (5,-1,1) 會產生連續值 (5 4 3 2 1) FOR /F %variable IN (file-set) DO command FOR /F %variable IN ("string") DO command FOR /F %variable IN ('command') DO command 或,如果使用 usebackq 選項: FOR /F %variable IN (file-set) DO command FOR /F %variable IN ('string') DO command FOR /F %variable IN (`command`) DO command 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 ] |
|
| 第6楼 willsort | 发表于 2006-01-03 19:35 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re panner:
嗯,感觉这篇繁体的 for 文档较简体的语义上要通顺一些,也没有类似以下引用内容的硬伤;只是满篇的术语,还是会让初学者更加云里雾里不知所云,也许在微软的定位来看, for 命令只是给系统管理员使用的,严谨和简练更加重要吧。
注意红色字体所示,第二行的双引号 " 应为单引号 ' ,第三行的单引号 ' 应为撇号 ` ,这是使用 usebackq 选项后的字符转义特性,原来的双引号被用作包涵带空格的文件名了,所以第一行的 file-set 本应该用一对双引号括起,但是因为文件名不带空格时可以不用双引号,而带空格时带双引号属于缺省的约定,不需要另行说明,所以算不上硬伤。 [ Last edited by willsort on 2006-1-3 at 19:37 ] |
|
| 第7楼 panner | 发表于 2006-01-04 01:17 |
| 新手上路 发帖 5 积分 14 | |
|
斑竹大人
win98下的for命令没有 /F等参数,又如何搞呢? 谢谢解答 |
|
| 第8楼 pillow | 发表于 2006-01-04 08:47 |
| 初级用户 发帖 82 积分 196 | |
|
感謝panner的支持
更感謝willsort的回答,因為您的答案真正解決了我對 ' 的疑問,謝謝! |
|
| 第9楼 willsort | 发表于 2006-01-04 17:01 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re pillow:
呵呵,现在已经很少有人咨询 win9x/MSDOS 下批处理的问题了,所以你应该在主题的首帖中注明你所应用的系统环境,以尽量避免大家做无用功。 win9x / msdos 下实现字符串操作,而且要求不使用第三方工具,复杂性将会很高;当然,对应你这个特定的问题,又相对简单了许多,下面提供我的方案。 将下面的代码保存为批处理文件,名为 DisplayName.bat 。程序假定已经得到了注册表的导出数据,文件名为 src.reg (至于 win9x 下注册表的导出方法有很多)生成的目标文件为 dst.txt 。从其中的代码可以看出,软件的 DisplayName 是先存放至变量再输出至文件的,因为变量的控制更为灵活,但是这样也会使 DisplayName 中出现的连续多个空格缩聚为一个空格,解决这个问题的办法是改用 debug ,只是算法会更加复杂一些。 [ Last edited by willsort on 2006-1-5 at 19:20 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |