Powershell Core,MXLinuxv 21,运行linux /usr/bin/x命令导致命令操作的对象“未找到文件”

r7xajy2e  于 2023-01-16  发布在  Linux
关注(0)|答案(1)|浏览(100)

我有一个powershell脚本,它包含三个部分:1.修改文件名以去除MicrosoftOS保留字符;2.运行/usr/bin/flac将 *.wav文件转换为 *.flac,3.使用.dll将ID 3标签从 *.mp3文件复制到 *.flac文件。
这个脚本的所有三个部分在我以前的Kubuntu v22.10系统上都能工作。这个脚本在MXLinux v21上的第2步失败了。错误是/usr/bin/flac命令的 *objects *“File not found”。/usr/bin/flac加载了,但是说它找不到给定的文件。第1步和第3步都能工作(我知道这一点是因为脚本需要一个参数来跳过第2步;因此,如果 *.wav文件已经是 *.flac文件,我可以运行它,例如,在以前的运行中,步骤2成功,但步骤3由于某种原因失败)。
下面是PS代码片段:

[string] $flacEXE = '/usr/bin/flac'
  if($convert -eq "yes" || $convert -eq "Yes" || $convert -eq "YES") 
  {
    if (Test-Path -Path "$workingPath/*cr.wav")
    { 
      $CRFiles = Get-ChildItem -Path "$workingPath/*cr.wav"
      foreach ($crFile in $CRFiles)
      {
        $output = & $flacEXE "`"$crFile`""
        if ($LASTEXITCODE -ne 0) 
        {
          Write-Host "The flac conversion created an error..." -ForegroundColor Red
          Write-Host "$output" -ForegroundColor Red
        }
      }
    }
    else 
    {
      Write-Host "No ClickRepair files found but Convert was Yes ... Aborting script.`n" -ForegroundColor Red
      throw $_.Exception.Message
      exit      
    }
  }

如果我在powershell(例如,在Visual Studio Code中)的提示符下运行/usr/bin/flac,它会失败;如果我在Linux终端上对同一文件夹中的相同文件运行/usr/bin/flac,它会工作。
我想这一定是某种权限问题(范围问题?),但无法弄清楚。这些文件位于挂载在/mnt/上的NTFS USB卷上。我最近迁移到了MXLinux,因此重新创建了我的系统。这是我第一次使用这个powershell脚本。
我应该注意到,Set-ExecutionPolicy的一致性对Linux上的Powershell Core无效,只对Windows系统有效,因此没有用。

rdrgkggo

rdrgkggo1#

替换:
$output = & $flacEXE ""$crFile""
与:

$output = & $flacEXE $crFile
  • bash等POSIX兼容的shell不同,您 * 不 * 需要在PowerShell中将作为参数传递的变量引用括起来-PowerShell没有与POSIX兼容的shell的所谓shell扩展等效的功能,特别是没有字拆分功能;因此,在PowerShell中,带空格的值不需要使用"..."进行保护。
      • ""$crFile""的工作只是由于一个长期存在的错误**在PowerShell 7.2.x之前,PowerShell如何将带有 * 嵌入式 * 双引号的参数传递给 * 外部程序 *。
  • 在PowerShell 7.3.0中,这个bug被修复了,所以上面的代码现在(正确地)将内部的" * 作为参数 * 的一个逐字部分传递给目标程序。(然而,"$crFile"在7.2.x和更高版本中都可以工作,尽管"仍然是不必要的,如上所述)。
  • 请参阅this answer了解更多信息,包括如何选择旧的、不正确的行为以实现向后兼容。另请注意,当前计划是仅在类Unix平台上继续 * 默认 * 为新的、正确的行为,并且 * 在Windows * 上,* 7.3.1之后的 * 某些版本 * 可能会恢复到旧的、不正确的行为,* 默认情况下 * 具有新的、需要 * 选择加入 * 的正确行为。

顺便说一句,re if($convert -eq "yes" || $convert -eq "Yes" || $convert -eq "YES")

  • if($convert -eq "yes" || $convert -eq "Yes" || $convert -eq "YES")替换为**if ($convert -eq 'yes')-PowerShell默认不区分大小写。[1]如果必须使用*多个 * 操作,则需要将它们与-or链接,而不是与||链接-||对 * 命令的成功状态 * 而不是 * 值 * 进行操作;例如:
  • $true || 'never get here'$false || 'never get here' * 不 * 触发||的RHS,因为$true$false都是 * 成功执行 * 的表达式,* 与它们的值无关 *,因此 * 不 * 触发|| pipeline-chain operator的RHS(类似地应用于&&)。
  • 对于基于 * 值 * 的操作(表达式 * 返回值 * 或命令 * 输出 *),使用-orlogical -or and -and operators

[1]对于 * 区分大小写 * 的行为,请使用操作数的c前缀变体,例如-eq;例如,'FOO' -ceq 'foo'$false。类似地,大多数标准小命令和switch语句默认是大小写不敏感的,并且提供-CaseSensitive开关作为 * opt-in *。

相关问题