欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Windows Powershell导出管道结果

程序员文章站 2022-06-25 10:12:18
可以将管道的结果转换成文本输出,默认是out-default。可以通过get-command -verb out查看powershell都有哪些输出的命令。 复制代码 代...

可以将管道的结果转换成文本输出,默认是out-default。可以通过get-command -verb out查看powershell都有哪些输出的命令。

复制代码 代码如下:

ps c:powershell> get-command -verb out

commandtype name         definition
----------- ----         ----------
cmdlet      out-default  out-default [-inputobject ]
cmdlet      out-file     out-file [-filepath]  [[-encoding]
cmdlet      out-gridview out-gridview [-inputobject ]
cmdlet      out-host     out-host [-paging] [-inputobject ]
cmdlet      out-null     out-null [-inputobject ] [-verbose]
cmdlet      out-printer  out-printer [[-name] ] [-inputobject
cmdlet      out-string   out-string [-stream] [-width ]
out-default 将输出发送到默认的格式化程序和默认的输出 cmdlet。
out-file 将输出发送到文件。
out-gridview 将输出发送到单独窗口中的交互表。
out-host 将输出发送到命令行。
out-null 删除输出,不将其发送到控制台。
out-printer 将输出发送到打印机。
out-string 将对象作为一列字符串发送到主机。

吸收输出结果

有的命令无论执行成功或失败都会有输出,有时不需要这些输出时可以使用 | out-null,这条命令的作用和 >$null 一样。尤其在函数中使用比较多,因为如果没有特别指明return 。powershell函数会把输出结果作为函数的返回值。为了避免这种麻烦,通常在管道后加一条命令out-null 或 >$null吸收输出结果。

复制代码 代码如下:

ps c:powershell> md abc

    目录: c:powershell

mode                lastwritetime     length name
----                -------------     ------ ----
d----        2011/12/19     17:05            abc

ps c:powershell> md abd >$null
ps c:powershell> md abe | out-null

修改管道格式

之前讨论过,powershell默认会在每行命令的末尾追加一条out-default,out-default默认包含了一条out-host,那是不是out-host就是英雄无用武之地了。事实上,可以通过out-host控制管道的版式。
powershell不但会自动把管道结果发送到输出设备上,而且还会把管道结果转换成可读的文本。这个自动转换与format-table有点像。但是完全依靠自动转换有时会碰到很奇怪的输出结果。
例如当单独使用get-service时,结果会以表格的形式输出,但是使用pwd;get-service时service信息以列表形式输出。

复制代码 代码如下:

ps c:powershell> get-service

status   name               displayname
------   ----               -----------
running  adobearmservice    adobe acrobat update service
stopped  aelookupsvc        application experience
stopped  alg                application layer gateway service

ps c:powershell> pwd;get-service

path
----
c:powershell

status      : stopped
name        : threadorder
displayname : thread ordering server

status      : running
name        : trkwks
displayname : distributed link tracking client

第二行使用了两条命令,通过分号间隔。但是为什么service信息会以列表显示 呢?因为经过powershell的解释器处理,上面例子中的第二条命令会变成:
& { pwd;get-service} | out-default
powershell在命令中没有发现特别指定的版式信息,就会尝试从第一条命令的第一个结果对象中寻找线索。并且把这种版式强加给紧接着的其它命令。
怎样避免上述问题,最好的办法就是要明确指定。
pwd;get-service | out-host

强制以文本显示

powershell的文本转换一般发生在管道的末尾,但是如果需要对文本处理可是强制转换成文本。

复制代码 代码如下:

ps c:powershell> ls . -recurse | out-string

 目录: c:powershell

mode         lastwritetime   length name
----         -------------   ------ ----
d---- 2011/12/19     17:05          abc
d---- 2011/12/19     17:06          abd
d---- 2011/12/19     17:06          abe
d---- 2011/11/29     18:21          myscript
-a--- 2011/12/19     11:31      500 a.html

ps c:powershell> (ls | out-string -stream).gettype()
ispublic isserial name     basetype
-------- -------- ----     --------
true     true     object[] system.array

excel导出对象

管道结果导出为文本文件看起来不规整,越读起来也不方便。所以最好导出为excel格式“csv”,这样的文件默认支持microsft excel程序打开,并处理。

复制代码 代码如下:

ps c:powershell> get-service | export-csv a.csv
ps c:powershell> .a.csv

使用这些导出命令时,切忌不要在管道中使用format-table,否则导出的结果不正常,自己可以测试。那怎样选择属性呢?可是使用select-object。

html导出对象

html导出对象和excel导出大同小异。

复制代码 代码如下:

ps c:powershell> get-service | convertto-html -title "ls result" | out-file a.html
ps c:powershell> .a.html