ForEach循环中正在重写的变量-Powershell
我正在尝试运行以下代码从.csv文件(如果选择作为参数)导入目录列表,然后执行foreach循环以确定在.csv文件中列出的目录中最近XX天修改了哪些文件 然而,$modfiles变量似乎在每次迭代中都会被覆盖,而不是被追加 正在导入的.csv中有3个目录,但我的输出仅显示上次导入目录中的相关文件。他们需要附加$modfiles吗 CSV内容: 输出: 以下是整个脚本:ForEach循环中正在重写的变量-Powershell,powershell,foreach,powershell-5.0,Powershell,Foreach,Powershell 5.0,我正在尝试运行以下代码从.csv文件(如果选择作为参数)导入目录列表,然后执行foreach循环以确定在.csv文件中列出的目录中最近XX天修改了哪些文件 然而,$modfiles变量似乎在每次迭代中都会被覆盖,而不是被追加 正在导入的.csv中有3个目录,但我的输出仅显示上次导入目录中的相关文件。他们需要附加$modfiles吗 CSV内容: 输出: 以下是整个脚本: [CmdletBinding(DefaultParameterSetName='ManualDirectory')] pa
[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
}
每次循环$importDirs时,都会为$modfiles指定一个值。每次迭代,您都会覆盖上一次迭代中的值
如果需要保留所有值的列表,请使用
$modfiles = $modfiles, (Get-Childitem ...)
# or
$modfiles += Get-ChildItem ...
使用+=运算符进行追加。谢谢,正是这些简单的事情让我明白了。
$importDirs = Import-Csv $importCsv
foreach ($importDir in $importDirs){
$modfiles = Get-ChildItem -Path $importDir.Directory -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -ge $modDate }
}
$modfiles = $modfiles, (Get-Childitem ...)
# or
$modfiles += Get-ChildItem ...