PowerShell 7.x:并行参数导致问题

PowerShell 7.x:并行参数导致问题

我想并行运行以下脚本(使用 PS 7.x),但当我这样做时,它会抛出错误。如果我从脚本中删除-Parallel(第 3 行)(和-ThrottleLimit 4(第 15 行)),它会正常工作 - 只是需要更长的时间才能完成。我可以对脚本进行任何快速修复以使其与-Parallel参数一起工作吗?谢谢!

01: $paths=@("O:\OD\OD1\OneDrive\OD1\Photos","O:\OD\FM\OneDrive\FM\Photos")
02: foreach ($path in $paths) {
03:     Get-ChildItem $path\*.tif -recurse | ForEach-Object -Parallel {
04: 
05:         [console]::foregroundcolor="White"   
06:         $basePath=("$path" -replace "\\", "\\")
07:         $origPath=(echo $_.DirectoryName)
08:         $base=(echo $_.BaseName)
09:         $newPath=($origPath -replace "$basePath", "O:\OD\FM\OneDrive\FM\Family Photos")
10:         $newPathAndFile=("$newPath"+"\"+"$base"+".jpg")
11: 
12:         if (!(Test-Path -path "$newPath")) {mkdir "$newPath"}
13:         
14:         if (!([system.io.file]::Exists("$newPathAndFile"))) {magick "$_" -resize 50% -quality 100 -define jpeg:extent=1MB "$newPathAndFile"; [console]::foregroundcolor="Green"; echo "`nComplete`: $newPathAndFile`n"}
15:     } -ThrottleLimit 4
16:     [console]::foregroundcolor="White"
17: }

具体来说,我收到以下错误(请注意,下面的“第 10 行”引用上面的“第 12 行”,因为它引用了foreach-object从第 3 行开始的第二个循环中的“第 10 行”):

在此处输入图片描述

答案1

尝试这个重构...

$paths = @('O:\OD\OD1\OneDrive\OD1\Photos','O:\OD\FM\OneDrive\FM\Photos')

foreach ($path in $paths) 
{
    Get-ChildItem -Path $path -FIlter '*.tif' -recurse | 
    ForEach-Object -Parallel {
        [console]::foregroundcolor = 'White'
          
        $basePath       = ($path -replace '\\', '\\')
        $origPath       = (Write-Output $PSitem.DirectoryName)
        $base           = (Write-Output $PSitem.BaseName)
        $newPath        = ($origPath -replace $basePath, 'O:\OD\FM\OneDrive\FM\Family Photos')
        $newPathAndFile = ("$newPath\$base.jpg")

        if (!(Test-Path -path $newPath)) 
        {mkdir $newPath}
        
        if (!([system.io.file]::Exists($newPathAndFile))) 
        {
            magick $PSItem -resize 50% -quality 100 -define jpeg:extent=1MB $newPathAndFile
            [console]::foregroundcolor = Green
            Write-Output "`nComplete`: $newPathAndFile`n"
        }
    } -ThrottleLimit 4

    [console]::foregroundcolor = 'White'
}

PowerShell:运行可执行文件

从 PowerShell 调用 Image Magick

别名的最佳实践

为什么首先要担心别名?

使用别名到底有什么大不了的?如果别名可以让代码更易于输入,那么在脚本中使用别名有什么坏处呢?对于脚本来说,有两个因素在起作用。首先,没有别名是一定存在的 — 即使是 Windows PowerShell 创建的别名也是如此。

在脚本中使用别名的真正危险......

但使用这样的代码确实违背了使用别名的目的。最后,最佳做法是避免在企业生产级脚本中使用别名。使用位置参数或部分参数名称时也是如此。

https://devblogs.microsoft.com/scripting/using-powershell-aliases-best-practices

何时不应使用别名

由于别名带来的所有好处,我可能倾向于一直使用别名。但是,别名也有一个缺点。别名可能难以阅读。

笔记

脚本开发的一个基本原则是,我对脚本的理解越深入,其中的错误就越少,并且修复任何可能出现的错误也就越容易。此外,由于脚本是可重复使用的,因此将来修改脚本也会更容易。花在脚本开发上的时间是对未来的投资。

还值得注意的是,PowerShell PSScriptAnalyzer 都会将别名视为错误,直到您展开它们,VSCode 也是如此。

VSCode 具有自动扩展已知别名的设置,并且 PowerShell ISE 有一个插件可以实现相同的功能。因此,人们可以在共享/部署之前使用别名进行开发并自动扩展。

相关内容