PowerShell同时运行脚本

时间:2014-05-12 12:12:55

标签: powershell

我创建了一个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

1 个答案:

答案 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-AsJobInvoke-Command命令依赖于PowerShell远程处理,因此必须至少在本地计算机上启用。


将参数块添加到“内部”脚本(您在上面发布的脚本)的顶部,如下所示:

param (
    [Parameter(Mandatory = $true)]
    [string] $Path
)

这样,您的“外部”脚本可以使用“{1}”参数传递目录路径,用于“内部”脚本。