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