我正在尝试创建此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
答案 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