Windows PowerShell读取文本文件

上一篇 / 下一篇  2010-03-24 10:55:31 / 个人分类:Windows PowerShell

尽管对文本文件的需要大概在很久以前就消失了,但是系统管理员仍然需要依靠文本文件来满足他们数据存储的需要。(我们正在讨论老旧的纯文本文件,而不是 XML文件。)事实上,当涉及到文本文件时,在过去的十年间只有一件事发生了变化:现在人们想知道如何用Windows PowerShell读取文本文件。

伙计们,你们来对地方了。

阅读是基础

到目前为止,用Windows PowerShell读取文本文件的最简单的方法是使用Get-Content cmdlet。(那其它方法呢?好的,比如,你能使用.NET Framework及System.IO类中的一些方法。)使用Get-Content来读取文本文件只需要调用该cmdlet并在其后跟上文本文件的路径。例如,以下命令用来读取文本文件C:\Scripts\Test.txt:

Get-Content C:\Scripts\Test.txt

作为读取结果,Windows PowerShell在控制台窗口显示文件内容:

Line 1

Line 2

Line 3

Line 4

Line 5

Line 6

Line 7

很棒吧?

如果你不想要在控制台窗口显示这些内容,至少不是马上显示,那么只需简单的将返回的信息赋值给一个变量,像这样:

$a = Get-Content C:\Scripts\Test.txt

你知道,当查看我们刚储存在变量中的文本文件的内容时,这也许是个好机会来确切解释信息是如何储存在变量中的。当Get-Content读取文本文件并在变量中储存内容时,数据是作为数组储存的,文件内的每一行(由一个回车换行符决定)代表了数组中的每一个项。需要证明这件事么?输入$a.GetType()命令然后看看你得到的是什么。下面的输出是你应当得到的:

IsPublic IsSerial Name BaseType

——– ——– —- ——–

True True Object[] System.Array

我们还需要关心$a是一个数组?是的,我们需要:通过将文本文件中的每一行作为数组中的单独项储存,使得PowerShell能够处理指定行(或者某些范围内的行)。例如,你想要只看文本文件的前三行?以下命令将完成这个小戏法:

(Get-Content C:\Scripts\Test.txt)[0..2]

那么我们在这里做了些什么?首先我们提取了整个C:\Scripts\Test.txt文件内的内容。注意我们将这个命令用括号括起来以便保证 PowerShell将在处理其它事之前首先完成Get-Content任务。在这之后我们使用PowerShell的标准数组标记来请求显示数组中索引号为0-2的项。(在PowerShell,或者其它计算机语言中,数组中第一项总是从索引号为0的项开始的。)那么我们最终在屏幕上会看到什么?

Line 1

Line 2

Line 3

顺便说一句,另一个显示开始的x行的方法是使用–totalcount参数,像这样:

Get-Content C:\Scripts\Test.txt -totalcount 3

在这个命令中,Get-Content将只会提取文本文件的前三行。如果你正在处理一个大文件的话,这是一个更好的方式来显示前三行,因为Get-Content将只会提取前三行。我们刚才向你呈现的那个命令,将提取整个文件,但是仅显示前三项。

现在,如何显示文本文件的最后三行文本呢?我们很高兴你能问这个问题:

(Get-Content C:\Scripts\Test.txt)[-1..-3]

再次,我们使用PowerShell的标准数组标记来指定我们要显示的文本文件的行数。[-1..-3]结构能被拆分成如下内容:

l -1代表了数组中的最后一项。索引号-2代表了数组中的倒数第二项,以此类推。

l 两个点(..)是PowerShell的范围操作符,标识我们想要获得指定的第一个值(-1)至指定的最后一个值(-3)范围内的数字。

l -3(如你可能猜想的)代表了数组中的倒数第三项。

最终结果?这就是最终结果:

Line 7

Line 6

Line 5

如果你想要从文本文件中获得指定的行那么使用类似这样的命令:

(Get-Content C:\Scripts\Test.txt)[3..5]

作为结果,我们得到了像这样的输出:

Line 4

Line 5

Line 6

不坏吧?

这里是另外一个经常被问道的问题:我如何对在文本文件中找到数据进行排序?例如,假设我们有看起来像这样的文本文件:

B

H

C

D

A

E

G

F

我们怎么样打开这个文件,对内容排序,然后显示排序后的内容?你已经知道这个问题的答案了吧?

(Get-Content C:\Scripts\Test.txt) | Sort-Object

我们在这里所做的是通过管道将文本文件的内容传递给Sort-Object cmdlet,然后让Sort-Object做它该做的事。顾名思义,其结果是:

A

B

C

D

E

F

G

H

是的,本例中PowerShell处理任务的方法比VBScript简单多了。在我们走之前让我们在尝试完成另一个任务。假设我们对定位包含特定值的文本文件感兴趣;例如,假设我们对追踪指定文件夹(C:\Scripts)中包含词组Hey, Scripting Guy!的文件感兴趣。我们怎么做?像这样:

Select-String C:\Scripts\*.txt -pattern “Hey, Scripting Guy!”

注意,我们甚至不需要使用Get-Content来打开文本文件;取而代之的是我们调用Select-String cmdlet,并传递给Select-String两个参数:

l 文件的路径是需要考虑的。如你所见,当指定路径时,我们能使用通配符。(我们用该路径来提取文件夹C:\Scripts内所有的.txt文件)

l –pattern参数,这个代表可我们需要寻找的文本。在本例中,我们使用一个简单的文本字符串(Hey, Scripting Guy!)。或者我们可以使用正则表达式,当设定该参数值时。

当运行先前的命令时,我们得到类似以下内容的输出(假设目标字符串能被找到):

C:\Scripts\Everyone.txt:3:Hey, Scripting Guy! How can I search a text file using VBScript?

C:\Scripts\Test.txt:1:Hey, Scripting Guy! How can I search a text file using Windows PowerShell?

这里的每一行的信息有多酷啊,而该信息可不是光看对象的外表就能得到的。注意如果我们将提取到的内容传递给Format-List cmdlet时将会发生什么?首先我们执行该命令:

Select-String C:\Scripts\*.txt -pattern “Hey, Scripting Guy!” | Format-List

然后我们惊奇地看到以下输出:

IgnoreCase : True

LineNumber : 3

Line : Hey, Scripting Guy! How can I search a text file using VBScript?

Filename : Everyone.txt

Path : C:\Scripts\Everyone.txt

Pattern : Hey, Scripting Guy!

IgnoreCase : True

LineNumber : 1

Line : Hey, Scripting Guy! How can I search a text file using Windows PowerShell?

Filename : Test.txt

Path : C:\Scripts\Test.txt

Pattern : Hey, Scripting Guy

只想看到每一个包含目标字符串文件的文件名?试下这个命令:

Select-String C:\Scripts\*.txt -pattern “Hey, Scripting Guy!” | Select-Object Filename

以下内容就是你应当得到的:

Filename

——–

Everyone.txt

Test.txt


TAG: PowerShell

 

评分:0

我来说两句

Open Toolbar