我实际上正在编写一个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函数的文档,但我真的不知道如何在此脚本中进行管理
答案 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]
。