在Powershell中的选择对象中使用变量

问题描述 投票:0回答:1

我有一个使用时间作为列名称创建的表。但是,如果第一行在某些小时(列)内没有数据,则该列不会显示表其余部分的列。因此,我试图创建一个动态选择语句,它将获取自午夜以来的每个小时,并将这些时间用作搜索变量。我已经完成创建 Select 语句,但它没有调用/执行查询。

任何关于获取返回数据和构建 HTML 表的建议将不胜感激。

代码:

$UniversalCurrTime = ((Get-Date).ToUniversalTime()).ToString('h tt')
$UniversalMidnight = ((Get-Date).ToUniversalTime().Date).ToString('h tt')
$hoursBetween = $UniversalMidnight

Write-host 'This is midnight: ' $UniversalMidnight
Write-host 'This is Current time: ' $UniversalTime
$HourSpan = @()
$HourSpan += 'VaultName'
$HourSpan += $UniversalMidnight #($hoursBetween).ToString('h tt')
Do{
    $HourSpan += "'" + ($hoursBetween).ToString('h tt') + "'"
    $hoursBetween = (Get-date $hoursBetween).AddHours(1)
    Write-host 'This is time being added to collection: ' $hoursBetween
}while($hoursBetween -le $UniversalCurrTime)

$HourSpan += 'TotalMessages'

$selectObject = '$reportList |Select-Object ' + (($HourSpan -split '\n') -join ",") + '| ConvertTo-Html -Fragment -ErrorAction SilentlyContinue'
$html = Invoke-Command -ScriptBlock {$selectObject}

在屏幕上输出但未执行返回数据。

$reportList |Select VaultName,'12 AM','1 AM','2 AM','3 AM','4 AM','5 AM','6 AM','7 AM','8 AM', '9 AM','10 AM','11 AM','12 PM','1 PM','2 PM','3 PM','4 PM','5 PM','6 PM','7 PM', '8 PM', '9PM', '10 PM', '11 PM', 'TotalMessages' |Where-Object { -Not [String]::IsNullOrWhiteSpace($_) }| ConvertTo-Html -Fragment -ErrorAction SilentlyContinue

这条语句应该被执行。

powershell html-table invoke-command scriptblock select-object
1个回答
0
投票

$selectObject = '$reportList |Select-Object ' + (($HourSpan -split '\n') -join ",") + '| ConvertTo-Html -Fragment -ErrorAction SilentlyContinue'

上面创建了一个 string 值。

$html = Invoke-Command -ScriptBlock {$selectObject}

上面的 - 可以简化为

$html = & { $selectObject }
并最终
$html = $selectObject
- 输出存储在
$selectObject
中的字符串,这解释了你所看到的内容。


暂且不考虑

$HourSpan
中存储的数组 (a) 是否有效构建,[1] (b) 预期的时间顺序比较是否有效以及 (c) 假设
$HourSpan += 'VaultName'
$HourSpan += 'TotalMessages'
已被 removed,您可能正在寻找以下内容:

$html = 
  $reportList |
  Select-Object (@('VaultName') + $HourSpan + 'TotalMessages') |
  ConvertTo-Html -Fragment -ErrorAction SilentlyContinue

也就是说,您可以将动态构造的属性名称数组直接传递给

-Property
的(位置隐含的)
Select-Object
参数。

使用数组作为 LHS - 使用

@(...)
数组子表达式运算符 确保 -
+
运算符执行(平面)数组连接


PowerShell 很少需要动态构建命令作为字符串,并且由于固有的安全风险,通常应该避免这样做,但在有必要的情况下,您有两种选择:


[1] 使用 +=

 在循环中扩展数组效率很低,因为考虑到数组的大小是固定的,必须在幕后
每次迭代中创建一个 new 数组;更有效的方法是使用诸如 do { ... } while (...)
foreach
 循环之类的语句作为 
表达式,并让 PowerShell 本身将输出收集到数组中:[array] $outputs = foreach (...) { ... }
 - 请参阅
这个答案。如果您需要手动创建数组,例如要创建多个,请使用有效可扩展的列表类型 - 请参阅此处

© www.soinside.com 2019 - 2024. All rights reserved.