我有一段PowerShell代码,它从Azure读取项目列表,并将它们格式化为一个表格供用户选择:
if ($SubscriptionArray.Count -eq 1) {
$SelectedSub = 1
}
# Get SubscriptionID if one isn't provided
while ($SelectedSub -gt $SubscriptionArray.Count -or $SelectedSub -lt 1) {
Write-host "Please select a subscription from the list below"
$SubscriptionArray | Select-Object "#", Id, Name | Format-Table
try {
$SelectedSub = Read-Host "Please enter a selection from 1 to $($SubscriptionArray.count)"
}
catch {
Write-Warning -Message 'Invalid option, please try again.'
}
}
在脚本的主区域中执行时,会输出预期结果:
我想多次使用这个逻辑,因此将其移到一个方法中:
function Get-IndexNumberFromArray(
[Parameter(Mandatory = $True)]
[array]$selectArray,
[Parameter(Mandatory = $True)]
[string]$message
) {
[int]$SelectedIndex = 0
# use the current subscription if there is only one subscription available
if ($selectArray.Count -eq 1) {
$SelectedIndex = 1
}
# Get SubscriptionID if one isn't provided
while ($SelectedIndex -gt $selectArray.Count -or $SelectedIndex -lt 1) {
Write-Host "$message"
$selectArray | Select-Object "#", Id, Name | Format-Table
try {
$SelectedIndex = Read-Host "Please enter a selection from 1 to $($selectArray.count)"
}
catch {
Write-Warning -Message 'Invalid option, please try again.'
}
}
return $SelectedIndex
}
此方法中的所有内容都很有效,但现在我的表格不再输出到窗口了。相反,用户只是提示从1到x中选择一个数字,而没有每个数字代表的上下文。
为什么表在脚本的主区域中工作,但不在函数中工作?
答案 0 :(得分:3)
Format-Table
实际上并没有打印表格,它会输出随后作为表格打印的对象。因此,如果您正在使用函数,那么Format-Table
输出将获得函数返回值的一部分。
您可以将Out-Host
添加到管道中,以强制Format-Table
的结果终止于主机,即控制台:
$selectArray | Select-Object "#", Id, Name | Format-Table | Out-Host