Powershell - 使用 Out-Gridview 将列表转换为 UI

Powershell - Convert list to UI with Out-Gridview

我有一个从 excel 读取的脚本,让用户选择一列。问题是列表不可读,我想向用户显示选择带有 UI 和 Out-Gridview 的版本的选项 还有一件事,我需要答案是一个数字 这是脚本:

$ExcelObject = New-Object -ComObject Excel.Application
$ExcelWorkBook = $ExcelObject.Workbooks.Open($SharePointSiteURL)
$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item("VIP List")
$rowMax = $ExcelWorkSheet.UsedRange.Rows.Count 
$colMax = $ExcelWorkSheet.UsedRange.Columns.Count 
$columns = [ordered]@{}
for ($col = 1; $col -le $colMax; $col++) {
    $name = $ExcelWorkSheet.Cells.Item(1, $col).Value()  # assuming the first row has the headers
    if ($name -ne $null){
    $columns[$name] = $col} 
}

$columns.GetEnumerator() | ForEach-Object {
    # {0,2} means to write the index number from $_.Value right aligned for two digits
    '{0,2}: {1}' -f $_.Value, $_.Name
}
do {
    $answer = Read-Host "Please enter the number of the column you want to read from" #. Press Q to exit
    # ask this question until the user enters a number or 'Q'
} until ($answer -eq 'Q' -or $answer -match '^\d{1,2}$')

switch ($answer) {
    'Q'  { break } # user wants to quit
    {1..$columns.Count} {
        # get the Name from the chosen value
        $action = $columns.Keys | Where-Object {$columns["$_"] -eq $answer}
        Write-Host "You chose to perform: '$action'" -ForegroundColor Cyan
        <# run $action #>
    }
}

看起来像这样:

要让用户select使用Out-GridView的工具版本,您需要构建一个对象数组,如下所示:

$ExcelObject = New-Object -ComObject Excel.Application
$ExcelWorkBook = $ExcelObject.Workbooks.Open($SharePointSiteURL)
$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item("VIP List")
$rowMax = $ExcelWorkSheet.UsedRange.Rows.Count 
$colMax = $ExcelWorkSheet.UsedRange.Columns.Count 

# now, have the loop output objects that will be collected in variable $columns
$columns = for ($col = 1; $col -le $colMax; $col++) {
    $name = $ExcelWorkSheet.Cells.Item(1, $col).Value()  # assuming the first row has the headers
    # if $name is not empty or whitespace only
    if ($name -match '\S') { 
        [PsCustomObject]@{
            Number  = $col
            Version = $name
        }    
    } 
}

# output to Out-GridView with -PassThru parameter so you can capture the selected item
$answer = ($columns | Out-GridView -Title 'Please select' -PassThru).Number
# if the user did not cancel
if ($answer) {
    # get the Name from the chosen value
    $action = $columns[$answer -1].Version
    Write-Host "You chose to perform: '$action'" -ForegroundColor Cyan
    <# run $action #>
}

请不要忘记在代码完成后从内存中删除使用过的 COM 对象,否则它们会残留在..

$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ExcelWorkSheet)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ExcelWorkBook)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ExcelObject)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()