在Powershell中获得正确输出的问题

时间:2017-07-28 01:00:56

标签: windows powershell

我正在尝试创建此PowerShell脚本,要求用户输入服务名称,运行Get-Service,并将结果显示给用户。

例如,如果用户要输入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

2 个答案:

答案 0 :(得分:3)

<强> TL;博士

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

与类似POSIX的shell(Unix)不同:

  • PowerShell 从不需要 "..."围绕变量引用,例如$Result

    • 事实上,这样做会将变量转换为字符串 - 这可能是意图也可能不是。
  • 如果您 想要一个字符串在变量引用周围使用"..."经常 - 但是与打印到终端(控制台)时相比,不一定会产生不同的表示。

  • 如果要进一步处理对象,请按原样 传递,否则您将失去PowerShell&#39;面向对象。

PowerShell传递对象 - 这代表了它与传统shell的巨大进化飞跃 - 而仅在(a)输出到终端或将输出发送到> Out-File)/ Out-String或(b) "..." 的文件>或(c)在应用.ToString() 时,这些对象字符串化

  • (a)使用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到culture- 敏感表示 (例如,(Get-Date '2017-01-01').ToString()在美英系统上产生1/1/17 12:00:00 AM - 取决于给定类型支持的内容。
      对于 .NET base types.ToString()表示与PowerShell的默认格式相同。

    • (b)的规则("..."内隐式字符串化)类似 到(c)&#39; s除了 PowerShell by design寻求文化 - 不变表示 支持 - 有关详细信息,请参阅我的this answer

答案 1 :(得分:0)

这是因为当您在某些类型的变量周围添加引号时,它会输出变量类型,而不是变量的实际内容。因此,删除变量输出上的引号将解决您的问题。用这个替换你的最后一行:

Write-Output $Result