windbg-.foreach循环输入(windbg script)

.foreach

.foreach 关键字分析一个或多个命令的输出并将该输出中每一个值作为另一个或多个命令的输入

.foreach [Options( Variable  { InCommands } ) { OutCommands 

.foreach 
[Options/s ( Variable  "InString) { OutCommands 

.foreach 
[Options/f ( Variable  "InFile) { OutCommands } 

Options
可以是下面选项的任意组合:
/pS InitialSkipNumber
使得开头的一些符号被跳过。InitialSkipNumber 指定不传递给OutCommands 的输出关键字的数量。
/ps SkipNumber
每次执行命令时都会跳过一些符号。每次将符号传递给OutCommands 之后,SkipNumber 个数的符号都会被忽略

我们首先搜索下带字符T的地址有哪些:

 
  1. 0:000> s -[1]a  0029eeec  L1000 "T"  
  2. 0x0029eefb  
  3. 0x0029ef03  
  4. 0x0029ef0b  
  5. 0x0029ef15  
  6. 0x0029f034  
  7. 0x0029f06a  
  8. 0x0029f07a  
  9. 0x0029f08a  
  10. 0x0029f09e  
  11. 0x0029f356  
  12. 0x0029f7f0  
  13. 0x0029f989  
  14. 0x0029fa50  

然后我们用.foreach把它们da出来

 
  1. 0:000> .foreach(place{s -[1]a  0029eeec  L1000 "T"}){da ${place}}  
  2.                        ^ Syntax error in '.foreach(place{s -[1]a  0029eeec  L1000 "T"}){da ${place}}'  
  3. 0:000> .foreach(place {s -[1]a  0029eeec  L1000 "T"}){da ${place}}  
  4. 0029eefb  "TencentTSVulFwTSVulFW.DAT"  
  5. 0029ef03  "TSVulFwTSVulFW.DAT"  
  6. 0029ef0b  "TSVulFW.DAT"  
  7. 0029ef15  "T"  
  8. 0029f034  "T"  
  9. 0029f06a  "T"  
  10. 0029f07a  "T"  
  11. 0029f08a  "T"  
  12. 0029f09e  "T"  
  13. 0029f356  "TxSignDemo"  
  14. 0029f7f0  "T.)"  
  15. 0029f989  "Ti.."  
  16. 0029fa50  "T.)"  

注意place和{之间必须有空格!

现在从第三个开始,每隔一个显示一个:

  1. 0:000> .foreach/pS3 /ps1(place {s -[1]a  0029eeec  L1000 "T"}){da ${place}}  
  2. 0029ef15  "T"  
  3. 0029f06a  "T"  
  4. 0029f08a  "T"  
  5. 0029f356  "TxSignDemo"  
  6. 0029f989  "Ti.."  

InFile
/f 一起使用。指定要解析的文本文件;结果会传递给OutCommands 。文件名InFile 必须用引号括起来我们在C盘建立个2.txt,内容为:

 
  1. 0x0029eefb  
  2. 0x0029ef03  
  3. 0x0029ef0b  
  4. 0x0029ef15  
  5. 0x0029f034  
  6. 0x0029f06a  
  7. 0x0029f07a  
  8. 0x0029f08a  
  9. 0x0029f09e  
  10. 0x0029f356  
  11. 0x0029f7f0  
  12. 0x0029f989  
  13. 0x0029fa50  


运行命令:

 
  1. 0:000> .foreach/f (place "c:2.txt"){da ${place}}  
  2. 0029eefb  "TencentTSVulFwTSVulFW.DAT"  
  3. 0029ef03  "TSVulFwTSVulFW.DAT"  
  4. 0029ef0b  "TSVulFW.DAT"  
  5. 0029ef15  "T"  
  6. 0029f034  "T"  
  7. 0029f06a  "T"  
  8. 0029f07a  "T"  
  9. 0029f08a  "T"  
  10. 0029f09e  "T"  
  11. 0029f356  "TxSignDemo"  
  12. 0029f7f0  "T.)"  
  13. 0029f989  "Ti.."  
  14. 0029fa50  "T.)"  

InCommands 的输出、InString 字符串或InFile 被解析时,任何数量的空格、tab符或回车都将会被当作单个分隔符。文本被分隔成的小片段被用来替换OutCommands 中的Variable

/s 一起使用。指定一个要解析的字符串;结果会传递给OutCommands

 
  1. 0:000> .foreach/s (place "0029ef03;0029ef0b"){da ${place} }  
  2. 0029ef03  "TSVulFwTSVulFW.DAT"  
  3.                    ^ Syntax error in 'da 0029ef03;0029ef0b '  
  4. 0:000> .foreach/s (place "0029ef03 0029ef0b"){da ${place}}  
  5. 0029ef03  "TSVulFwTSVulFW.DAT"  
  6. 0029ef0b  "TSVulFW.DAT"  


所以,只是把空格,tab当成分隔符,不是分号!此原则适用于string和file

原文地址:https://www.cnblogs.com/renyuan/p/5700966.html