Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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数据表删除空列逻辑不正确_Powershell_For Loop - Fatal编程技术网

PowerShell数据表删除空列逻辑不正确

PowerShell数据表删除空列逻辑不正确,powershell,for-loop,Powershell,For Loop,这是我第一次编写一个可以调用自身的函数。我试图删除DataTable中行为空的所有列 代码工作正常,但会出现一些错误。出于这样或那样的原因,它最后一次在For循环中循环,旧的$列仍在内存中。虽然每次调用函数时我都会再次填充它。。。我不明白为什么 代码: Function Remove-EmptyColumns { $Columns = $DataTable.Columns.Count $Rows = $DataTable.Rows.Count for ($c =

这是我第一次编写一个可以调用自身的函数。我试图删除
DataTable
中行为空的所有列

代码工作正常,但会出现一些错误。出于这样或那样的原因,它最后一次在
For
循环中循环,旧的
$列仍在内存中。虽然每次调用函数时我都会再次填充它。。。我不明白为什么

代码:

 Function Remove-EmptyColumns {
    $Columns = $DataTable.Columns.Count
    $Rows    = $DataTable.Rows.Count

    for ($c = 0; $c -lt $Columns; $c++) {    
        $Empty = 0       
        for ($r = 0; $r -lt $Rows; $r++) {
            if ($DataTable.Rows[$r].Item($c).ToString() -eq '') {
                $Empty++
            }
        }
        if ($Empty -eq $Rows) {
            $DataTable.Columns.Remove($DataTable.Columns[$c])
            Remove-EmptyColumns
        }
    }
}

谢谢您的帮助。

为什么它是递归方法?尝试移除Remove EmptyColumns,它应该可以工作,不是吗

编辑:尝试

Function Remove-EmptyColumns {
    $Columns = $DataTable.Columns.Count
    $Rows    = $DataTable.Rows.Count

    $columnsToRemove = @()

    for ($c = 0; $c -lt $Columns; $c++) {    
        $Empty = 0       
        for ($r = 0; $r -lt $Rows; $r++) {
            if ($DataTable.Rows[$r].Item($c).ToString() -eq '') {
                $Empty++
            }
        }
        if ($Empty -eq $Rows) {
            $columnsToRemove.Add($DataTable.Columns[$c])
        }
    }

    $columnsToRemove | ForEach-Object { 
            $DataTable.Columns.Remove($_) }
}

只是一个想法,但我喜欢使用IsNullOrEmpty的字符串静态方法

if ([string]::IsNullOrEmpty($DataTable.Rows[$r].Item($c).ToString()))
{ ... }

这消除了值可能不等于“”但改为$Null的问题,并在一行中完成该操作。

我认为是这样,但它不起作用。删除一列后,其他列的ID号将发生更改。您编辑的建议很好,谢谢。我不得不将其更改为
$columnsToRemove+=$DataTable.Columns[$c]
,因为默认情况下它是一个普通的
数组
,而不是
数组列表
。这个变通方法很棒!谢谢你,我应该自己考虑一下PNo令人担忧,工作完美!谢谢你的帮助,我盯着自己看不见:PGORD思考,我应该考虑更多地使用你的建议。我从来没有这样做,实际上是因为它看起来如此非PowerShell原生,如果这是一个字:D谢谢你的提醒!