首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >变量在ForEach循环- Powershell中被覆盖。

变量在ForEach循环- Powershell中被覆盖。
EN

Stack Overflow用户
提问于 2020-02-18 17:51:53
回答 1查看 914关注 0票数 2

我正在尝试运行以下代码,从.csv文件导入目录列表(如果选择作为参数),然后执行foreach循环,以确定.csv文件中列出的目录中在过去XX天中修改了哪些文件。

但是,$modfiles变量似乎在每次迭代中都被覆盖,而不是被追加。

正在导入的.csv中有3个目录,但我的输出只显示了最后一个导入目录中的相关文件。他们是去附加$modfiles吗?

CSV内容:

代码语言:javascript
复制
$importDirs = Import-Csv $importCsv
foreach ($importDir in $importDirs){
            $modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
}

输出:

下面是整个脚本:

代码语言:javascript
复制
[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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 18:02:15

代码语言:javascript
复制
$importDirs = Import-Csv $importCsv
foreach ($importDir in $importDirs){
            $modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
}

每次循环$importDirs时,都会为$modfiles分配一个值。每次迭代时,您都会重写前一次迭代中的值。

如果需要保存所有值的列表,请使用

代码语言:javascript
复制
$modfiles = $modfiles, (Get-Childitem ...)

# or
$modfiles += Get-ChildItem ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60286791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档