Powershell命令笔记

2013年3月24日

搜索哪些文件含有指定字符串

Get-ChildItem ..\scripts\*azz* |Select-String 571

867161.xml:301:<t id="571">[author]3Y黑客联盟 3B-%s3X[/author][text colwidth='500']Not our best choice, but let's see anyway...\n\n[right]3ZHacker Corp.3X[/right][/text]  

.\scripts\*azz*是路径,支持通配符。

571是欲查找的字符串,是正则表达式。如果有空格,要用引号包起来。如果加选项-simplematch,则不作为正则表达式。

输出结果是文件名+行号+该行内容。

Get-ChildItem ..\scripts\*azz* |Select-String 571|select Filename

Filename  
--------  
azz.ext.nom.std.xml  
azz.gr.interv.ComIA.xml  
azz.prime.calcule.xml  
azz.prime.comm.menu.IA.general.xml  
azz.prime.comm.menu.xml  
azz.prime.commerce.ComIA.xml  
azz.prime.commerce.ComIA.xml  
azz.prime.commerce.IA.xml  
azz.prime.commerce.IA.xml  
azz.prime.commerce.IA.xml  
Azz.status.xml

如果有些文件的一行很长,上一命令的输出很长,这时可以用此命令,仅显示文件名(Filename)。也可以改成显示路径(Path)。

具体有哪些可以选择性显示,用get-property命令查看,MSDN对此的说明很难找。

Get-ChildItem ..\scripts\*azz* |Select-String 571|select Filename|Get-Unique -AsString

Filename  
--------  
azz.ext.nom.std.xml  
azz.gr.interv.ComIA.xml  
azz.prime.calcule.xml  
azz.prime.comm.menu.IA.general.xml  
azz.prime.comm.menu.xml  
azz.prime.commerce.ComIA.xml  
azz.prime.commerce.IA.xml  
Azz.status.xml  

如果有些文件里不止一次出现指定的字符串,则在上例中文件名会显示多次。

此命令则只显示不重复的文件名。

原先的返回值是对象,AsString选项要求把返回值先ToString,然后排序。(在本例中,如果不加AsString,则只会显示第一个对象。)

文件批量重命名

ls *.jpg | %{ mi -LiteralPath $_ ($_.name -replace "Help","帮助") }

%ForEach-Object的别名,大括号里面是循环体,$_是循环变量。

miMove-Item的别名。