我有一个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系统有效,因此没有用。
1条答案
按热度按时间rdrgkggo1#
替换:
$output = & $flacEXE "
"$crFile""
与:
bash
等POSIX兼容的shell不同,您 * 不 * 需要在PowerShell中将作为参数传递的变量引用括起来-PowerShell没有与POSIX兼容的shell的所谓shell扩展等效的功能,特别是没有字拆分功能;因此,在PowerShell中,带空格的值不需要使用"..."
进行保护。"
"$crFile""
的工作只是由于一个长期存在的错误**在PowerShell 7.2.x之前,PowerShell如何将带有 * 嵌入式 * 双引号的参数传递给 * 外部程序 *。"
* 作为参数 * 的一个逐字部分传递给目标程序。(然而,"$crFile"
在7.2.x和更高版本中都可以工作,尽管"
仍然是不必要的,如上所述)。顺便说一句,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(类似地应用于&&
)。-or
、logical-or
and-and
operators。[1]对于 * 区分大小写 * 的行为,请使用操作数的
c
前缀变体,例如-eq
;例如,'FOO' -ceq 'foo'
是$false
。类似地,大多数标准小命令和switch
语句默认是大小写不敏感的,并且提供-CaseSensitive
开关作为 * opt-in *。