Powershell-导出CSV外部循环仅打印/导出最后一行
是否可以调整此代码以导出Powershell-导出CSV外部循环仅打印/导出最后一行,powershell,Powershell,是否可以调整此代码以导出foreach循环之外的所有行: 这工作正常(在循环内): 但是,当我移动$results | Export Csv-Path“c:\1.Csv”-NoTypeInformation-append外部循环时, 只有一行(最后一行)保存到CSV 在循环内部,$results变量包含所有行,当我将此变量移到循环外部时,写入主机$results仅打印一行(最后一行)计算出: 将$results变量移到循环外(使其为“全局”) 值得一提的是,您的代码可以压缩很多。您的许多步骤都不
foreach
循环之外的所有行:
这工作正常(在循环内):
但是,当我移动$results | Export Csv-Path“c:\1.Csv”-NoTypeInformation-append
外部循环时,
只有一行(最后一行)保存到CSV
在循环内部,$results
变量包含所有行,当我将此变量移到循环外部时,写入主机$results
仅打印一行(最后一行)计算出:
将$results
变量移到循环外(使其为“全局”)
值得一提的是,您的代码可以压缩很多。您的许多步骤都不是必需的:
$results = Get-VM | Where State –eq Running | Get-VMNetworkAdapter | ForEach-Object {
[pscustomobject]@{
'VM NAME' = $_.VMName
'IP ADDRESS' = ($_.IPAddresses -notmatch ':') -join ' '
'MAC ADDRESS' = ($_.MacAddress -replace '(..)(..)(..)(..)(..)','$1:$2:$3:$4:$5:') -join ' '
'HYPER-V HOST' = $env:COMPUTERNAME
}
}
$results | Export-Csv -Path "c:\1.csv" -NoTypeInformation
注:
- 您可以通过管道将
返回的VM直接导入Get VM
Get VMNetworkAdapter
- 如果对单个属性进行筛选,则不需要
的脚本块Where Object
比Where State-eq Running
更易于编写和读取Where{$\ State-eq'Running}
类似于$\u.ipaddress-notmatch':'
将返回-notmatch的运算符在数组上工作<代码>'a','b','0','c'-notmatch'\d'
'a','b','c'
- 这同样适用于
<代码>'a0','b1','c2'-replace'\d',''将返回-replace
。根本不需要任何'a','b','c'
循环foreach
应该比使用WMI获取计算机名更快$env:COMPUTERNAME
- 在脚本块(如
script块)中创建的任何未指定给变量的对象都将出现在脚本块的输出中。这就是为什么ForEach object{…}
工作。无需使用$results=…|ForEach对象{…}
显式创建数组并向其添加值@()
- 将哈希表强制转换为
比使用[pscustomobject]
容易得多添加成员
foreach
循环之外。由于您已经在$results
中拥有了所有内容,因此可以直接将变量导出到csv。删除-append
参数。我做了,但它不起作用
$vms = Get-VM | Where { $_.State –eq ‘Running’ } | Select-Object -ExpandProperty Name
$results = @()
foreach($vm in $vms) {
# Get network interface details
$out = Get-VMNetworkAdapter -vmname $vm | select VMName, MacAddress, IPAddresses
# Remove duplicate VM names
$vm_name = $out.VMName | Get-Unique
# In case more than 1 IP, put it in same row separated by space (192.168.1.1, 192.168.1.2)
$ip = ($out.IPAddresses | ForEach-Object {
$_ | ? {$_ -notmatch ':'}
}) -join " "
# If more than 1 MAC , put it in same row separated by space (00:15:5D:58:12:5E 00:15:5D:58:12:5F )
$mac = ($out.MacAddress | ForEach-Object {
$_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")
}) -join ' '
$comp = Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty name
$obj = New-Object -TypeName psobject
$obj | Add-Member -MemberType NoteProperty -Name "VM NAME" -Value $vm_name
$obj | Add-Member -MemberType NoteProperty -Name "IP ADDRESS" -Value $ip
$obj | Add-Member -MemberType NoteProperty -Name "MAC ADDRESS" -Value $mac
$obj | Add-Member -MemberType NoteProperty -Name "HYPER-V HOST" -Value $comp
$results += $obj
}
$results| Export-Csv -Path "c:\1.csv" -NoTypeInformation
$results = Get-VM | Where State –eq Running | Get-VMNetworkAdapter | ForEach-Object {
[pscustomobject]@{
'VM NAME' = $_.VMName
'IP ADDRESS' = ($_.IPAddresses -notmatch ':') -join ' '
'MAC ADDRESS' = ($_.MacAddress -replace '(..)(..)(..)(..)(..)','$1:$2:$3:$4:$5:') -join ' '
'HYPER-V HOST' = $env:COMPUTERNAME
}
}
$results | Export-Csv -Path "c:\1.csv" -NoTypeInformation