在PowerShell中异步移动文件

时间:2014-11-20 11:00:17

标签: powershell asynchronous powershell-v3.0

我有以下问题:我正在编写一个循环来检查某些文件是否出现在文件夹中,如果是,则将这些文件移动到另一个文件夹。

该脚本现在运行良好,这是它的代码:

$BasePath = "C:\From"
$TargetPath = "C:\To"
$files = Get-ChildItem -File -Recurse -Path "$($BasePath)\$($Filename)" -ErrorAction SilentlyContinue

foreach ($file in $files)
{
    $subdirectorypath = split-path $file.FullName.Replace($BasePath, "").Trim("\")
    $targetdirectorypath = "$($TargetPath)\$($subdirectorypath)"
    if ((Test-Path $targetdirectorypath) -eq $false)
    {
        Write-Host "Creating directory: $targetdirectorypath"
        md $targetdirectorypath -Force
    }

    Write-Host "Copying file to: $($targetdirectorypath.TrimEnd('\'))\$($File.Name)"
    Move-Item $File.FullName "$($targetdirectorypath.TrimEnd('\'))\$($File.Name)" -Force
}

然而,由于其中一些文件可能非常大,我想以异步方式移动这些文件,在“即发即忘”中#34;办法。使用PowerShell的最佳方法是什么?这个脚本可能会永远运行,因此我认为任何异步作业都必须在完成复制后自行处理。

感谢您的建议

1 个答案:

答案 0 :(得分:5)

我会使用后台工作:

$scriptblock = {
    $BasePath = $args[0]
    $TargetPath = $args[1]
    $files = Get-ChildItem -File -Recurse -Path "$($BasePath)\$($Filename)" -ErrorAction SilentlyContinue

    foreach ($file in $files)
    {
        $subdirectorypath = split-path $file.FullName.Replace($BasePath, "").Trim("\")
        $targetdirectorypath = "$($TargetPath)\$($subdirectorypath)"
        if ((Test-Path $targetdirectorypath) -eq $false)
        {
            Write-Host "Creating directory: $targetdirectorypath"
            md $targetdirectorypath -Force
        }

        Write-Host "Copying file to: $($targetdirectorypath.TrimEnd('\'))\$($File.Name)"
        Move-Item $File.FullName "$($targetdirectorypath.TrimEnd('\'))\$($File.Name)" -Force
    }
}

$arguments = @("C:\From","C:\To")
start-job -scriptblock $scriptblock -ArgumentList $arguments

如果以后要查看作业的任何输出,可以执行以下操作

Get-Job | Receive-Job