Function Get PowerShell函数在运行期间将表写入屏幕,但不作为返回追加

Function Get PowerShell函数在运行期间将表写入屏幕,但不作为返回追加,function,powershell,Function,Powershell,下面是一个简短的示例(我的实际代码要求我在函数运行期间输出更多的表,并从中获得一个返回的输出): 它不是在函数中输出$CSV,而是附加到返回中,并进入函数插入的变量 PS C:\Windows\system32> $ROW = Select-RowFromCSV -CSV (Import-Csv "C:\scripts\csv.csv") select row # from CSV: 0 PS C:\Windows\system32> $ROW Name Phon

下面是一个简短的示例(我的实际代码要求我在函数运行期间输出更多的表,并从中获得一个返回的输出):

它不是在函数中输出
$CSV
,而是附加到返回中,并进入函数插入的变量

PS C:\Windows\system32>  $ROW = Select-RowFromCSV -CSV (Import-Csv "C:\scripts\csv.csv")
select row # from CSV: 0

PS C:\Windows\system32> $ROW
Name         Phone                                                                                          

Dan         111111                                                                                         
Dave        5555555                                                                                        
Oliver      666666                                                                                         
Dan         111111                                                                                         

PS C:\Windows\system32> 

我尝试了多种方法尝试将其打印到屏幕上,但与写入主机对字符串的预期效果不同,我尝试的其他方法都不适用于非字符串对象(FT、写入输出、回显)。

如果您希望在不影响函数输出的情况下将内容输出到控制台,
Write Host
可能是最简单的解决方案(但事实并非如此)。您的代码需要如下所示:

Function Select-RowFromCSV ($CSV)
{
    Write-Host ($CSV | Format-Table | Out-String)
    Return $CSV[(read-host "select row # from CSV")]
}

$ROW = Select-RowFromCSV -CSV (Import-Csv "raid.csv")
正如您所观察到的,因为您的对象不是字符串,所以您需要根据需要对其进行格式化,然后将其转换为字符串(
| Format Table | Out string

但是,您可能需要考虑使用<代码>写VBBOSE ,这将仅在使用冗长的开关时,将输出写入到冗长的流中。要使用此函数,您需要向函数中添加

[cmdletbinding()]
Param()
块,如下所示:

Function Select-RowFromCSV 
{
    [cmdletbinding()]
    Param($CSV)

    Write-Verbose ($CSV | Format-Table | Out-String)
    Return $CSV[(read-host "select row # from CSV")-1]
}
然后使用-Verbose开关执行函数以查看额外的输出:

$ROW = Select-RowFromCSV -CSV (Import-Csv "raid.csv") -Verbose
进一步解释:

在原始函数中,您输出了所有的
$CSV
,因为它单独出现在一行上,然后还返回了一行。在PowerShell中,
Return
关键字有点误导,它没有定义只返回的内容,它只是触发函数立即结束,输出的任何内容都将进入输出流

您还应该注意,用户输入的行号需要从0开始,因为数组索引从0开始

如果希望第一行为1而不是0,则可能需要执行以下操作:

$CSV[(read-host "select row # from CSV")-1]

您也可以完全删除
Return
关键字,因为这不是必需的。如果您想更明确,我个人倾向于
写输出

只需使用以下方法:

$counter=0
$table=@()
XXX | foreach对象{
做点什么;
$table+=[pscustomobject]@{
XXXX
}
$table[$counter]
美元柜台++

}
用Out-Gridview代替
-passthru
选项来选择行怎么样
$ROW=Import Csv“C:\scripts\Csv.Csv”| Out GridView-PassThru
谢谢@mark!,非常感谢。你为我节省了几个小时重新编写函数,就像我最后几乎完成的那样。你可能还想看看gridview以获得更图形化的选项,我认为你可以从中捕获用户选择。是的,你只需使用-passthru
$CSV[(read-host "select row # from CSV")-1]