当前位置: 移动技术网 > IT编程>脚本编程>Shell > Windows Powershell导出管道结果

Windows Powershell导出管道结果

2017年12月08日  | 移动技术网IT编程  | 我要评论

可以将管道的结果转换成文本输出,默认是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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网