【发布时间】:2011-08-23 02:31:36
【问题描述】:
我对 PowerShell 和编程还很陌生,所以我确信这段代码可以进一步优化。
然而,我对这段代码最大的问题是它将来自 foreach 循环的数据放入内存中。防止这种情况的最佳方法是什么?
我开始使用在此处找到的脚本重写此脚本:PowerShell: delete files older than x days
编辑:哦,顺便说一下,每个 TargetFolder 中大约有 60 000~ 个文件。
## Set Window Title
$title = $Host.UI.RawUI.WindowTitle
$titdef = $title
$Host.UI.RawUI.WindowTitle = "Checking files. Do NOT close " + "($title)"
## Debug (0=Nothing, 1=Extended log, 2=Extended log+Screen)
$Debug = "2"
## Log file
$log = "C:\status\status.txt"
Add-Content $log "nul"
## Clear log before adding new data
Remove-Item $log
## Folders to check
$TargetFolder1 = “\\server\c$\BiztalkProjects\UDC\output\ume”
$TargetFolder2 = “\\server\c$\BiztalkProjects\UDC\output\upp”
## Required stuff
$Now = Get-Date
$Days = “2”
$TwoDays = $Now.AddDays(-$Days)
$Folder1 = get-childitem $TargetFolder1 -include *
$Folder2 = get-childitem $TargetFolder2 -include *
## Window Message
"Checking for files newer than $Days days in:"
"$TargetFolder1"
"$TargetFolder2"
""
"This may take 5-15 minutes . . . (Will commit about 250MB~ RAM during the period)"
## Reset variable $OK to "0"
$OK = 0
if ($Debug -eq "2") {"Check1"}
foreach ($File in $Folder1) {
$FileLastWrite = $File.LastWriteTime
if ($File.LastWriteTime -le $TwoDays) {
$OK = $OK + "0"
if ($Debug -eq "2") {
"OK + 0 (=$OK) $File ($FileLastWrite)"
}
} else {
$OK = $OK + "1"
if ($Debug -eq "2") {
"OK + 1 (=$OK) $File ($FileLastWrite)"
}
}
}
if ($Debug -eq "2") {"Check2"}
foreach ($File in $Folder2) {
$FileLastWrite = $File.LastWriteTime
if ($File.LastWriteTime -le $TwoDays) {
$OK = $OK + "0"
if ($Debug -eq "2") {
"OK + 0 (=$OK) $File ($FileLastWrite)"
}
} else {
$OK = $OK + "1"
if ($Debug -eq "2") {
"OK + 1 (=$OK) $File ($FileLastWrite)"
}
}
}
if ($OK -gt "0") {
if ($Debug -eq "2") {
""
"Found $OK file(s) newer than $Days days"
}
Add-Content $log "OK"
if ($Debug -ge "1") {
Add-Content $log "Found $OK file(s) newer than $Days days"
}
}
else {
if ($Debug -eq "2") {
""
"Found $OK file(s) newer than $Days days"
}
Add-Content $log "Error"
if ($Debug -ge "1") {
Add-Content $log "Found $OK file(s) newer than $Days days"
}
}
$Host.UI.RawUI.WindowTitle = $titdef
此版本有效。感谢所有帮助过的人!
## Set Window Title
$title = $Host.UI.RawUI.WindowTitle
$titdef = $title
$Host.UI.RawUI.WindowTitle = "Checking files. Do NOT close " + "($title)"
## Debug (0=Nothing, 1=Extended log, 2=Extended log+Screen)
$Debug = "2"
## Log file
$log = "C:\status\status.txt"
Add-Content $log "nul"
## Clear log before adding new data
Remove-Item $log
## Folders to check
$TargetFolder1 = “\\server\c$\BiztalkProjects\UDC\output\ume”
$TargetFolder2 = “\\server\c$\BiztalkProjects\UDC\output\upp”
## Required stuff
$Now = Get-Date
$Days = “2”
$TwoDays = $Now.AddDays(-$Days)
## Window Message
"Checking for files newer than $Days days in:"
"$TargetFolder1"
"$TargetFolder2"
""
"This may take 5-15 minutes . . ."
## Reset variable $OK to "0"
$OK = 0
get-childitem $TargetFolder1,$TargetFolder2 -filter *.xml |where-object {
$FileLastWrite = $_.LastWriteTime
if ($FileLastWrite -le $TwoDays) {
$OK = $OK + "0"
} else {
$OK = $OK + "1"
}
}
if ($OK -gt "0") {
if ($Debug -eq "2") {
""
"Found $OK file(s) newer than $Days days"
}
Add-Content $log "OK"
if ($Debug -ge "1") {
Add-Content $log "Found $OK file(s) newer than $Days days"
}
}
else {
if ($Debug -eq "2") {
""
"Found $OK file(s) newer than $Days days"
}
Add-Content $log "Error"
if ($Debug -ge "1") {
Add-Content $log "Found $OK file(s) newer than $Days days"
}
}
$Host.UI.RawUI.WindowTitle = $titdef
【问题讨论】:
标签: memory powershell foreach