Переменная перезаписывается в ForEach l oop - Powershell - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь запустить приведенный ниже код, чтобы импортировать список каталогов из файла .csv (если выбран в качестве параметра), а затем выполнить foreach l oop, чтобы определить, какие файлы были изменены за последние XX дней. в каталогах, перечисленных в файле .csv.

Однако, похоже, что переменная $ modfiles перезаписывается на каждой итерации, а не добавляется.

Импортируемый .csv содержит 3 каталога, но в моих выходных данных отображаются только соответствующие файлы из последний импортированный каталог. Можно ли добавлять $ modfiles?

CSV Содержимое:

enter image description here

$importDirs = Import-Csv $importCsv
foreach ($importDir in $importDirs){
            $modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
}

Вывод:

enter image description here

Вот весь сценарий:

[CmdletBinding(DefaultParameterSetName='ManualDirectory')]
param (
    [Parameter(Mandatory = $true, ParameterSetName = 'ManualDirectory')]
    [System.String]
    $dir,

    [Parameter(Mandatory = $true, ParameterSetName = 'ImportDirectory')]
    [System.String]
    $importCsv,

    [Parameter(Mandatory=$true)]
    [int]$days,

    [switch]$exportCsv,

    [switch]$console

)

Process {
    #Clear-Host
    $totSize = 0
    $totFiles = 0
    $modDate = (Get-date).AddDays(-$days).Date
    If ($dir){
        $modfiles = Get-ChildItem -Path $dir -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
    }
    If ($importCsv){
        $importDirs = Import-Csv $importCsv
        foreach ($importDir in $importDirs){
            $modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
       }
    }
    If ($exportCsv){
        $modfiles | Select-Object -Property FullName, Length,LastWriteTime | Export-Csv -Path .\modFiles.csv -NoTypeInformation
    }
    foreach ($file in $modfiles){
        $totFiles = $totFiles + 1
        $totSize = $totSize + $file.Length
        If ($console -eq $true){
            Write-Host $file.FullName
        }
    }

    If ($totSize -lt 1MB){
        $outSize = $totSize/1KB
        $unit = "KB"
    }
    elseif (($totSize -ge 1MB) -and ($totSize -lt 1GB)){
        $outSize = $totSize/1MB
        $unit = "MB"   
    }
    elseif ($totSize -ge 1GB){
        $outSize = $totSize/1GB
        $unit = "GB" 
    } 

    $outRound = [math]::Round($outSize,2)
    Write-Host $totFiles "Files"
    Write-Host $outRound $unit
}

1 Ответ

1 голос
/ 18 февраля 2020
$importDirs = Import-Csv $importCsv
foreach ($importDir in $importDirs){
            $modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
}

Каждый раз, когда вы l oop через $ importDirs, вы присваиваете значение $ modfiles. На каждой итерации вы перезаписываете значения предыдущей итерации.

Если вам нужно сохранить список всех значений, добавьте данные с помощью

$modfiles = $modfiles, (Get-Childitem ...)

# or
$modfiles += Get-ChildItem ...
...