【问题标题】:Powershell can not call ImageMagick commands - IM MontagePowershell 无法调用 ImageMagick 命令 - IM Montage
【发布时间】:2023-04-05 01:12:01
【问题描述】:

我在 PowerShell 中编写了一个脚本,并且在不同的计算机上调用 Image Magick 的 montage.exe 取得了各种成功。我编写脚本的计算机执行“蒙太奇”命令没有问题,但是在另一台安装了 IM 的计算机上脚本错误:

montage : The term 'montage' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At \\Server\Contact_Sheet_Local.ps1:51 char:9
+         montage -verbose -label %t -pointsize 20 -background '#FFFFFF ...
+         ~~~~~~~
+ CategoryInfo          : ObjectNotFound: (montage:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

我尝试过使用montage.exe,甚至尝试了整个路径C:\Program Files\ImageMagick-7.0.3-Q16\montage.exe。另外我尝试先设置目录:

Set-Location -Path 'C:\Program Files\ImageMagick-7.0.3-Q16'
montage...

每次在特定计算机上都会失败。我试过 IM 版本 7.0.3-Q16 和 6.9.1-6-Q8 都是 x64,因为两台计算机都是 x64

过去,我在 .bat 中创建了使用 ImageMagick 的脚本,并且我必须定义 .exe 的完整路径,如上所述。但这在 PowerShell 中似乎没有帮助。

有人对这个问题有任何建议或经验吗?

【问题讨论】:

标签: powershell imagemagick imagemagick-montage


【解决方案1】:

如果您的路径有空格,那么如果您只是尝试基于它执行,它将失败。您需要使用点运算符

$Exe = 'C:\Program Files\ImageMagick-6.9.1-6-Q8\montage.exe'
If (-not (Test-Path -Path $Exe))
{
    $Exe = 'C:\Program Files\ImageMagick-7.0.3-Q16\montage.exe'
}
. $Exe -arg1 -etc

【讨论】:

  • 再次您好,感谢@TheIncorrigible1 的建议。虽然我确信这会起作用,但我最终发现该错误仅发生在 ISE 中,并且右键单击并使用 PowerShell 运行不会产生错误。我会记住点运算符,因为我以前不熟悉。谢谢!
  • 您应该使用& 来调用可执行文件,而不是. 来点源它。 (虽然这“有效”,但从语义上讲是不正确的。)
  • 点源会影响范围并在当前范围内执行以下操作,而不是创建新范围(这是脚本的正常和默认行为)。除非您完全了解它的作用,否则您不应该使用 dot-source。 (详情请阅读about_Scopes 文档。)
  • 如果您理解,那么当我们已经拥有& 运算符时,IMO 不建议将其作为此问题的解决方案,这不会影响范围。看到这个答案的人可能会误解运营商之间的区别,使用.,并为自己制造一些奇怪的问题。
  • @TheIncorrigible1 如果您希望在 exe 完成后执行某些内容,则在新范围内执行会导致并发问题。 使用 .& 对 @ 没有影响987654329@ 命令,因为外部命令不了解 PowerShell 作用域。我同意@Bill_Stewart:你应该更喜欢& 而不是.,除非你真的想要点源语义。
【解决方案2】:

PowerShell 默认不执行当前目录中的程序。如果要运行位于当前目录中的可执行文件,请在可执行文件的名称前加上 .\./。示例:

Set-Location "C:\Program Files\ImageMagick-7.0.3-Q16"
.\montage.exe ...

如果您在字符串或字符串变量中有可执行文件的名称并且想要执行它,您可以使用&(调用或调用)运算符来执行此操作:

& "C:\Program Files\ImageMagick-7.0.3-Q16\montage.exe" ...

如果您指定的路径和文件名不包含空格,则不需要& 运算符;示例:

C:\ImageMagick\montage.exe ...

你也可以这样写:

& C:\ImageMagick\montage.exe ...

如果您在字符串变量中有可执行文件的文件名并且想要执行它,请使用&;示例:

$execName = "C:\Program Files\ImageMagick-7.0.3-Q16\montage.exe"
& $execName ...

【讨论】:

  • 这都是很好的信息@Bill_Stewart。感谢您的宝贵意见。
  • @Garrett 如果您发现一个有帮助的答案,通常会对其进行投票。
  • 嗨@Bill Stewart,我最终没有使用任何提供的解决方案,因为该问题仅在 ISE 中发生,并且运行 PowerShell 脚本提供了预期的输出。也就是说,我发现您提供的信息很有帮助,并计划在未来使用这些知识。
  • PowerShell 的控制台版本和 ISE 在行为上没有功能差异。
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多