Windows Powershell用Get-ChildItem所做的一些酷事情
获得隐藏文件及系统文件
让我们从讨论一个你很可能遇到,甚至有可能没有意识到的场景开始。假设我们在文件夹c:script下有以下的一组文件:
1.File1.txt
2.
3.File2.txt
4.
5.File3.txt
6.
7.File4.txt
8.
9.File5.txt
让我们再假设下文件File3.txt和File4.txt都是隐藏文件。当我们运行Get-ChildItem C:script时,你推测我们会得到什么?你是完全正确的;这就是我们将得到的:
1.Mode LastWriteTime Length Name
2.
3.---- ------------- ------ ----
4.
5.-a--- 7/26/2007 9:13 AM 0 File1.txt
6.
7.-a--- 7/26/2007 9:13 AM 0 File2.txt
8.
9.-a--- 7/26/2007 9:13 AM 0 File5.txt
为什么只有三个文件?因为,默认情况下,Get-ChildItem不返回有关隐藏文件及系统文件的信息。(没有什么不寻常之处;如果你启动cmd.exe然后运行dir命令,你将得到同样的结果。)这有点令人失望,不是么?
不,不完全是这样;幸运的是。有非常简单的方法怂恿Get-ChildItem来向你展示文件夹内的所有文件,包括隐藏文件及系统文件。在cmd.exe中你能通过运行dir /a命令获得文件夹中的所有文件列表(包括隐藏文件及系统文件);在Windows powershell中,你能通过以下命令获得文件夹中的所有文件列表(包括隐藏文件及系统文件):
1.Get-ChildItem C:Scripts -force
所有你要做的就是添加-force参数,那么Get-ChildItem将会像这样返回文件夹内所有文件的列表:
1.Mode LastWriteTime Length Name
2.
3.---- ------------- ------ ----
4.
5.-a--- 7/26/2007 9:13 AM 0 File1.txt
6.
7.-a--- 7/26/2007 9:13 AM 0 File2.txt
8.
9.-a-h- 7/26/2007 9:13 AM 0 File3.txt
10.
11.-a-h- 7/26/2007 9:13 AM 0 File4.txt
12.
13.-a--- 7/26/2007 9:13 AM 0 File5.txt
如果你仅对隐藏文件感兴趣呢?(等价于dir / AH命令)?一种方式是带-force参数运行Get-ChildItem,然后将返回的数据通过管道传递给Where-Object
1.cmdlet:
2.
3.Get-ChildItem C:Test -force| Where-Object {$_.mode -match "h"}
如你所见,我们使用Where-Object来筛选出在Mode属性中包含字母h(代表“hidden”,隐藏)的文件。
从多个文件夹中获得文件
如果你一直在用Get-ChildItem cmdlet的话那么你可能知道,默认情况下,Get-ChildItem指向你展示指定文件夹中的文件(比如,C:Sciprt);如果你也想要得到在指定文件夹中的子文件夹中文件的信息,那么你需要添加-recurse参数,像这样:
1.Get-ChildItem C:Scripts -recurse
不错。但是如果你想要获得三个不同文件夹中信息,不是子文件夹而是另一个文件夹,那该怎么办?(例如,C:Scripts, C:Test, and C:Documents and SettingsKenmyerDesktop.)好的,这里有一个建议:直接从所有的三个不同文件夹中提取信息。事实上,Get-ChildItem允许你指定多个文件路径,所有你要做的就是用逗号分隔路径(如果路径中包含空格,则用双引号将路径名引起来):
1.Get-ChildItem C:Scripts, C:Test, "C:Documents and SettingsKenmyerDesktop"
只对在这三个文件夹中的某个文件子集感兴趣(例如,只对.PS1文件感兴趣)?没问题;只需要添加–filter参数并给上你的过滤标准:
1.Get-ChildItem C:Scripts, C:Test, "C:Documents and SettingsKenmyerDesktop" –filter "*.ps1"
或者,通过管道将返回的数据转递给Where-Object,像这样:
1.Get-ChildItem C:Scripts, C:Test, "C:Documents and SettingsKenmyerDesktop" |
2.
3.Where-Object {$_.Extension -eq ".ps1"
我们没告诉你这将很有趣么?
只提取文件及文件夹名
这里有一个时不时将要用到的技巧。当同文件及文件夹打交道时,你经常只想要文件名。处理这个问题的一种方式是提取所有信息然后通过管道将数据传递给
1.Select-Object cmdlet:
2.
3.Get-ChildItem C:Scripts | Select-Object Name
但是还有更快速更简单的方式;只需带上-name参数当调用Get-ChildItem时:
1.Get-ChildItem C:Scripts -name
试一下,然后看看会发生什么。
统计文件夹中项目数
好的,你知道:看上去太阳最后还是出来了,这意味着我们要走了。然而在我们走之前,让我们在向你展示Get-ChildItem的最后一个小技巧。有时你真的无须知道文件夹中有什么文件;所有你要知道的是在特定文件夹中能找到多少文件(如果有的话)。下面的命令就是你能用来快速统计文件夹中文件数量:
1.(Get-ChildItem C:Scripts).Count
我们在这里做了什么?我们只是简单的使用Get-ChildItem来返回所有在文件夹C:Script中找到的文件集合;因为这是一个集合,我们所要做的就是回显Count属性的值,这告诉我们集合中有的项目数。注意括号的使用:我们将Get-ChildItem用括号括起来来确保Windows PowerShell首先处理集合然后才回显集合的Count属性的值。
当然,你能在调用Get-ChildItem时包含筛选器。想要知道在文件夹C:Script中有多少个.PS1文件?好的,我们来试试:
1.(Get-ChildItem C:Scripts -filter "*.ps1").Count