【问题标题】:How do I join two lines in PowerShell如何在 PowerShell 中加入两行
【发布时间】:2017-11-27 09:39:30
【问题描述】:

我正在尝试通过 PowerShell 在 Hyper-V 中获取有关我们的 VM 的信息。

这是我目前得到的:

$Path = 'c:/VM.csv'
"Name,CPUs,Dynamischer Arbeitsspeicher,RAM Maximum (in MB),RAM Minimum (in MB), Size" > $Path
$line1 = Get-VM | %{($_.Name, $_.ProcessorCount, $_.DynamicMemoryEnabled, ($_.MemoryMaximum/1MB), ($_.MemoryMinimum/1MB)) -join ","} 
$line2 = Get-VM –VMName * | Select-Object VMId | Get-VHD | %{$_.FileSize/1GB -join ","} 
$out = $line1+","+ $line2
Write-Output  $out | Out-File $Path -Append 
Import-Csv -Path $Path | Out-GridView

问题是第二个对象 ($line2) 应该与 $line1 在同一列中。如您所见,当前有关 VM 大小的信息 ($line2) 以行的形式写入 $line1 的输出下方。顺序也错了。

知道我的代码有什么问题吗?

提前致谢。

【问题讨论】:

  • 为什么不直接使用export-csv
  • 您将这些行作为字符串串接,但显然希望得到一个列表作为最终结果。尝试将最后 3 行替换为:@($line1) + $line2

标签: powershell csv


【解决方案1】:

我觉得你有点搞砸了,

Export-CSV 无需手动定义 csv 结构即可完成这项工作。

无论如何,关于你的代码,我认为你可以稍微改进一下,(我没有 hyper-v 来测试这个,但我认为它应该可以工作)

我所做的是创建一个结果数组来保存最终数据,然后使用 foreach 循环我迭代 Get-VM 结果并在每次迭代结束时为每个 VM 创建一行我要添加到最终结果数组的行,所以:

$Results = @()
foreach ($VM in (Get-VM))
{
    $Row = "" | Select Name,CPUs,'Dynamischer Arbeitsspeicher','RAM Maximum (inMB)','RAM Minimum (in MB)',Size
    $Row.Name = $VM.Name
    $Row.CPUs = $VM.ProcessorCount
    $Row.'Dynamischer Arbeitsspeicher' = $VM.DynamicMemoryEnabled
    $Row.'RAM Maximum (inMB)' = $VM.MemoryMaximum/1MB
    $Row.'RAM Minimum (in MB)' = $VM.MemoryMinimum/1MB
    $Total=0; ($VM.VMId | Get-VHD | %{$Total += ($_.FileSize/1GB)})
    $Row.Size = [math]::Round($Total)
    $Results += $Row
}

$Results | Export-Csv c:\vm.csv -NoTypeInformation

【讨论】:

  • 完美运行,谢谢!只剩下一个问题:如果一个 VM 连接了两个或多个 VHDx,脚本会创建输出 System.Object[],可能是因为它现在有两个 VHDx 值,并且无法在一行中显示。知道如何解决这个问题吗?
  • 试试($VM.VMId | Get-VHD | %{$_.FileSize/1GB}) -join ','
  • 谢谢!在加入值之前是否有可能使用[math]::RoundFileSize
  • ($VM.VMId | Get-VHD | %{[math]::Round($_.FileSize/1GB)}) -join ','
  • 最后一个:是否可以为每个VM添加$Row.Size中的所有值并循环结果。提前致谢!
【解决方案2】:

这绝对不是构建对象列表的正确方法,您应该这样做:

Get-VM | Select Name, 
    @{Name = "CPUs"; Expression = {$_.ProcessorCount},
    @{Name = "Dynamischer Arbeitsspeicher"; Expression = {$_.DynamicMemoryEnabled},
    @{Name = "RAM Maximum (in MB)"; Expression = {$_.MemoryMaximum/1MB},
    @{Name = "RAM Minimum (in MB)"; Expression = {$_.MemoryMinimum/1MB},
    @{Name = "Size"; Expression = {$_.VMId | Get-VHD | %{$_.FileSize/1GB -join ","}} | 
Export-Csv c:\vm.csv -NoTypeInformation

【讨论】:

  • CSV 部分在哪里?用户更费心在 CSV 中获取它。
  • @Ranadip Dutta,一旦你有了一个合适的对象列表,你就可以用它把它传送到任何你想要的地方。不过,我已经添加了Export-Csv ...,但您也可以将其发送到Out-GridView
  • 是的,我知道。但是你在那个答案中提到了那个?请编辑并放置上下文。否则这个答案仍然很模糊,因为 AVshalom 已经以正确的方式呈现。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多