如下翻译来自微软
TechNet
脚本中心
:
http://www.microsoft.com/technet/scriptcenter/resources/pstips/jul07/pstip0706.mspx
译者: Edengundam(马涛)
在通配符中使用范围运算符(Using the Range Operator in Wildcard Queries)
在Windows PowerShell中, 你不会对像
Get-ChildItem (一个基本等价于dir命令的cmdlet) cmdlet在执行查询时, 允许你使用像星号(*)和问好(?)的标准通配符感到惊讶. 例如, 假设你希望查看C:/Scripts目录下的所有以字符 a 开头的文件. 没问题; 只需要将星号作为你命令的一部分即可:
Get-ChildItem C:/Scripts/a*
这个例子没啥值得兴奋或: 在Windows PowerShell (和Cmd.exe中的星号一样)星号表示“任意个的字符,” 恩, 这个命http://www.microsoft.com/technet/scriptcenter/resources/pstips/jul07/pstip0706.mspx令返回所有文件名以字母a开头的后面跟着任意个字符的文件. (从本质上讲, 星号还表示空串: 文件名为
A没有文件扩展名的文件也会被这个命令返回.)
同样的, 你可以使用问号表示文件名中的一个字符. 例如, 假设你有一些文件命名为FileA1.txt, FileA2.txt, FileA3.txt, 等等. (这个例子中, 一直包含到FileA9.txt文件). 你如何在一个命令中返回这些文件呢? 类似这样:
Get-ChildItem C:/Scripts/FileA?.txt
或者结合通配符, 在不考虑文件扩展名情况下, 返回所有的“FileA”文件:
Get-ChildItem C:/Scripts/FileA?.*
真是太棒了! 这里还有些更棒的工具. 假设你需要列出所有以字母 A-F开头的文件. 在Cmd.exe你如何完成它呢? 实话实说, 我们不会. 但是, 你可以在Windows PowerShell执行下面的命令来完成这个任务:
Get-ChildItem C:/Scripts/[a-f]*
正如你所见到, 这里我们使用了范围运算符 –
[a-f] – 这个运算符要求PowerShell返回那些以指定字符开头的文件名:
a到
f. 通过在末尾添加星号, 我们进一步说明我们不关心跟随在第一个字符后面的其他字符(如果该文件名长度大于1). 当执行这个命令时, 我们将会得到什么样结果呢? 接过类似下面这样:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 5/23/2007 9:52 AM 93 addresses.txt
-a--- 11/17/2006 2:52 PM 708 alice.txt
-a--- 2/26/2007 10:44 AM 732 Alice2.txt
-a--- 3/12/2007 8:08 AM 88 bullet.gif
-a--- 6/15/2007 8:07 AM 1060 ccs.csv
-a--- 5/14/2007 8:41 AM 8 computers.txt
-a--- 5/23/2007 10:36 AM 114 current.txt
-a--- 2/22/2007 12:56 AM 730 decode.txt
-a--- 2/26/2007 10:33 AM 732 Decoded.txt
-a--- 2/22/2007 1:06 AM 728 Decrypt.txt
-a--- 5/23/2007 10:36 AM 59 Differences.txt
-a--- 7/3/2007 10:38 AM 5781 drawing.TXT
-a--- 7/3/2007 10:47 AM 17920 drawing.xls
-a--- 4/3/2007 8:29 AM 13824 Employees.xls
-a--- 2/22/2007 12:44 AM 2916 encode.txt
-a--- 2/26/2007 10:44 AM 732 Encoded.txt
-a--- 2/21/2007 12:24 AM 732 EncodedAlice.txt
-a--- 2/22/2007 1:06 AM 2852 Encrypt.txt
-a--- 2/21/2007 12:10 AM 1458 Encrypted.txt
-a--- 5/24/2007 10:08 AM 408 erase.vbs
-a--- 10/9/2006 8:30 PM 649 fv.ps1
很棒吧? 只关心那些以
c 到
f的文件? 这并没有什么问题; 只需要适当的设置范围运算符即可:
Get-ChildItem C:/Scripts/[c-f]*
这个运算符对数字也一样适用. 需要一个以数字而不是字母开头的文件列表嘛? 没问题(译注: Okey-doke这个就是OK的意思):
Get-ChildItem C:/Scripts/[0-9]*
当然了对于你关心一个范围的字符时, 这些例子做的很好了. 但是如果你只是对一个特定集合的字母感兴趣, 这些字母无法构成连续的范围呢? (例如, 以字母
b, 字母
d或字母
f开头的文件.) 没问题; 你只需要将这些字母放在范围运算符中即可. 只要不指定连字符, PowerShell就知道将这些字母当作独立的字母而不是字幕范围来处理:
Get-ChildItem C:/Scripts/[bdf]*
它能不能做到啊? 它当然能啦:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 3/12/2007 8:08 AM 88 bullet.gif
-a--- 2/22/2007 12:56 AM 730 decode.txt
-a--- 2/26/2007 10:33 AM 732 Decoded.txt
-a--- 2/22/2007 1:06 AM 728 Decrypt.txt
-a--- 5/23/2007 10:36 AM 59 Differences.txt
-a--- 7/3/2007 10:38 AM 5781 drawing.TXT
-a--- 7/3/2007 10:47 AM 17920 drawing.xls
-a--- 10/9/2006 8:30 PM 649 fv.ps1
如果这样还不够, 你可以在你命令的任意位置使用范围运算符; 它不一定只用来表示第一个字符. 例如, 假设你需要列出
第二个字母是
l,
n, 或者
r的文件. (我们并不知道你为什么需要这个列表; 假装你想要吧.) 这个使用问号表示文件名中第一个字母, 范围运算符表示第二个字母, 星号表示其余的字母的命令有点神奇:
Get-ChildItem C:/Scripts/?[lnr]*
这里你将看到期待的输出结果:
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/17/2006 2:52 PM 708 alice.txt
-a--- 2/26/2007 10:44 AM 732 Alice2.txt
-a--- 7/3/2007 10:38 AM 5781 drawing.TXT
-a--- 7/3/2007 10:47 AM 17920 drawing.xls
-a--- 2/22/2007 12:44 AM 2916 encode.txt
-a--- 2/26/2007 10:44 AM 732 Encoded.txt
-a--- 2/21/2007 12:24 AM 732 EncodedAlice.txt
-a--- 2/22/2007 1:06 AM 2852 Encrypt.txt
-a--- 2/21/2007 12:10 AM 1458 Encrypted.txt
-a--- 5/24/2007 10:08 AM 408 erase.vbs
-a--- 5/24/2007 10:07 AM 850 WriteToCD.vbs
不错, 很不错.