我想并行运行以下脚本(使用 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'
}
为什么首先要担心别名?
使用别名到底有什么大不了的?如果别名可以让代码更易于输入,那么在脚本中使用别名有什么坏处呢?对于脚本来说,有两个因素在起作用。首先,没有别名是一定存在的 — 即使是 Windows PowerShell 创建的别名也是如此。
在脚本中使用别名的真正危险......
但使用这样的代码确实违背了使用别名的目的。最后,最佳做法是避免在企业生产级脚本中使用别名。使用位置参数或部分参数名称时也是如此。
https://devblogs.microsoft.com/scripting/using-powershell-aliases-best-practices
何时不应使用别名
由于别名带来的所有好处,我可能倾向于一直使用别名。但是,别名也有一个缺点。别名可能难以阅读。
笔记
脚本开发的一个基本原则是,我对脚本的理解越深入,其中的错误就越少,并且修复任何可能出现的错误也就越容易。此外,由于脚本是可重复使用的,因此将来修改脚本也会更容易。花在脚本开发上的时间是对未来的投资。
还值得注意的是,PowerShell PSScriptAnalyzer 都会将别名视为错误,直到您展开它们,VSCode 也是如此。
VSCode 具有自动扩展已知别名的设置,并且 PowerShell ISE 有一个插件可以实现相同的功能。因此,人们可以在共享/部署之前使用别名进行开发并自动扩展。