将写入进度栏添加到脚本Powershell

时间:2019-12-21 16:39:49

标签: powershell

我实际上正在编写一个Powershell脚本,该脚本按日期对图片和视频进行排序。该脚本可以正常工作,但是我想添加一个进度条,而且我不知道从哪里开始,这对我来说可能有点棘手,这就是为什么我要寻求帮助。

这是对图片进行排序的功能

foreach ($file in $Images) 
{
    $Directory = $destinationDirectory + "Pictures\" + $file.LastWriteTime.Date.ToString('yyyy') + "\" + $file.LastWriteTime.Date.ToString('MMM') 

if (!(Test-Path $Directory))
{

    New-Item $directory -type directory
}

Copy-Item $file.fullname $Directory 
}

我阅读了有关Write-progress函数的文档,但我真的不知道如何在此脚本中进行管理

2 个答案:

答案 0 :(得分:2)

使用变量保存复制文件的数量,为每个操作增加它,然后显示百分比。 Write-Progress的示例有一个很好的示例。

我建议也使用PowerShell管道,而不要使用foreach

类似的事情(准备就绪后,请删除-WhatIf

$images |
    ForEach-Object 
    -Begin { 
        $filesCopied = 0
    } `
    -Process {
        $Directory = "$destinationDirectory\Pictures\$($_.LastWriteTime.Date.ToString('yyyy'))\$($_.LastWriteTime.Date.ToString('MMM'))"

        if (!(Test-Path $Directory)) {
            New-Item $directory -type directory -WhatIf
        }

        Copy-Item $_.fullname $Directory -WhatIf

        $filesCopied += 1
        Write-Progress -Activity "Copied $_.FullName" `
            -CurrentOperation "Copying $_" `
            -Status "Progress:" `
            -PercentComplete (($filesCopied / $Images.Count) * 100)
    }

答案 1 :(得分:1)

Write-Progress cmdlet需要一些数学才能使其适合您的情况。应该这样做:

$i = 1
foreach ($file in $Images)
{
    $Directory = $destinationDirectory + "Pictures\" + $file.LastWriteTime.Date.ToString('yyyy') + "\" + $file.LastWriteTime.Date.ToString('MMM') 

    if (!(Test-Path $Directory))
    {
    New-Item $directory -type directory
    }
Copy-Item $file.fullname $Directory
[int]$Percent = $i / $Images.count * 100
Write-Progress -Activity "Copying photos" -Status "$Percent% Complete:" -PercentComplete $Percent
$i++
}

首先,从计数器变量$i开始,并将其设置为1代表第一项。该设置是在循环外部进行的,因此每次循环运行时都不会重置为1。

然后,在循环内部,通过将$Percent的值除以项目数并将其乘以100来定义$i变量。然后,用必要的值调用Write-Progress参数以显示进度。然后使用$i++将计数器向上递增1。

旁注:通过将$Percent放在[int]前面将其设置为整数,这将强制其显示整数。如果要查看分数值,只需删除[int]