我创建了一个PowerShell脚本来删除超过X天的所有文件和文件夹。这完全正常,日志也很好。由于PowerShell有点慢,因此在处理大量数据时删除这些文件和文件夹可能需要一些时间。
我的问题:如何让这个脚本同时在多个目录($ Target)上运行?
理想情况下,我们希望在Win 2008 R2服务器上的计划任务中使用此文件并使用输入文件(txt,csv)粘贴一些新的目标位置。
感谢您的帮助/建议。
脚本
#================= VARIABLES ==================================================
$Target = \\share\dir1"
$OlderThanDays = "10"
$Logfile = "$Target\Auto_Clean.log"
#================= BODY =======================================================
# Set start time
$StartTime = (Get-Date).ToShortDateString()+", "+(Get-Date).ToLongTimeString()
Write-Output "`nDeleting folders that are older than $OlderThanDays days:`n" | Tee-Object $LogFile -Append
Get-ChildItem -Directory -Path $Target |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$OlderThanDays) } | ForEach {
$Folder = $_.FullName
Remove-Item $Folder -Recurse -Force -ErrorAction SilentlyContinue
$Timestamp = (Get-Date).ToShortDateString()+" | "+(Get-Date).ToLongTimeString()
# If folder can't be removed
if (Test-Path $Folder)
{ "$Timestamp | FAILLED: $Folder (IN USE)" }
else
{ "$Timestamp | REMOVED: $Folder" }
} | Tee-Object $LogFile -Append # Output folder names to console & logfile at the same time
# Set end time & calculate runtime
$EndTime = (Get-Date).ToShortDateString()+", "+(Get-Date).ToLongTimeString()
$TimeTaken = New-TimeSpan -Start $StartTime -End $EndTime
# Write footer to log
Write-Output ($Footer = @"
Start Time : $StartTime
End Time : $EndTime
Total runtime : $TimeTaken
$("-"*79)
"@)
# Create logfile
Out-File -FilePath $LogFile -Append -InputObject $Footer
# Clean up variables at end of script
$Target=$StartTime=$EndTime=$OlderThanDays = $null
答案 0 :(得分:1)
实现这一目标的一种方法是编写一个“外部”脚本,将“要清理的目录”作为参数传递给“内部”脚本。
对于“外部”脚本,请使用以下内容:
$DirectoryList = Get-Content -Path $PSScriptRoot\DirList;
foreach ($Directory in $DirectoryList) {
Start-Process -FilePath powershell.exe -ArgumentList ('"{0}\InnerScript.ps1" -Path "{1}"' -f $PSScriptRoot, $Directory);
}
注意:使用Start-Process
启动新进程,即默认,异步。如果使用-Wait
参数,则进程将同步运行。由于您希望事物更快速和异步地运行,因此省略-Wait
参数应该可以达到预期的效果。
或者,您可以使用Invoke-Command
来启动PowerShell脚本,使用以下参数:-File
,-ArgumentList
,-ThrottleLimit
和-AsJob
。 Invoke-Command
命令依赖于PowerShell远程处理,因此必须至少在本地计算机上启用。
将参数块添加到“内部”脚本(您在上面发布的脚本)的顶部,如下所示:
param (
[Parameter(Mandatory = $true)]
[string] $Path
)
这样,您的“外部”脚本可以使用“{1}”参数传递目录路径,用于“内部”脚本。