Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-导出CSV外部循环仅打印/导出最后一行_Powershell - Fatal编程技术网

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
注:

  • 您可以通过管道将
    Get VM
    返回的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'
  • 这同样适用于
    -replace
    <代码>'a0','b1','c2'-replace'\d',''将返回
    'a','b','c'
    。根本不需要任何
    foreach
    循环
  • $env:COMPUTERNAME
    应该比使用WMI获取计算机名更快
  • 在脚本块(如
    ForEach object{…}
    script块)中创建的任何未指定给变量的对象都将出现在脚本块的输出中。这就是为什么
    $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