2017-07-28 66 views
2

我在尝试制作此PowerShell脚本,该脚本会要求用户输入服务名称,通过Get-Service运行,并将结果显示给用户。在Powershell中获取正确输出的问题

例如,如果用户是进入vmtools它会显示:

Status  Name  DisplayName 
------  ----  ----------- 
Running  vmtools VMware Tools 

这是我的代码:

Write-host "Enter Service name" 
$ServiceName = read-host 
$Result = get-service $ServiceName 
Write-Output "$Result" 

然而,它只输出:System.ServiceProcess.ServiceController

回答

0

也就是说因为当你为某些类型的变量添加引号时,它会输出变量类型,而不是变量的实际内容。因此,删除变量输出中的引号可以解决您的问题。这种替换您的最后一行:

Write-Output $Result 
3

TL;博士

$Result # Implicitly outputs $Result - no need for Write-Output or "..." 

与POSIX样弹(UNIX):

  • PowerShell的从未要求"..."围绕可变参考,如$Result

    • 事实上,这样的变量转换为字符串 - 这可能是也可能不是意图。
  • 如果想用"..."围绕可变参考经常一个- 但不一定结果打印到终端当超过不同表示(控制台)

  • 如果目的是进一步处理,把它传递原样,否则你会失去PowerShell的面向对象的好处。

PowerShell的传递对象周围 - 表示从传统炮弹其巨大的进化飞跃 - 仅在与的(a)输出到终端>发送输出到一个文件( Out-File)/ Out-String或(b)内部"..."或施加.ToString()当(C)是这些对象字符串化

  • (一)使用PowerShell的默认格式的系统,它允许你定义任何.NET类型的自定义表示(与几个预定义的表示);例如输出散列表@{ one = 1; two = 2}产生漂亮打印的2列布局;见Get-Help about_format.ps1xml

  • (b)和(c)中旁路 Powershell的默认格式:

    • (c)中,直接调用每个对象的.ToString()方法 - 可以从一个几乎无意义的类型名称的范围 - 仅表示(如您的情况,或如在@{ one = 1; two = 2 }.ToString(),其产生System.Collection.Hashtable到一个文化 - 敏感表示(例如,在US-English系统上,(Get-Date '2017-01-01').ToString()产生1/1/17 12:00:00 AM) - 取决于给定类型支持的任何情况。
      对于.NET base types.ToString()表示与PowerShell的默认格式相同。

    • (B)类的规则(隐式内"..."字串)是类似至(c)'除了PowerShell中通过设计寻求一种文化 - 不变表示如果支持 - 为详情请参见我的this answer