PowerShell中如何将变量传入FontForge的-c脚本字符串?
在PowerShell中动态传递变量到FontForge的
-c脚本字符串 问题分析
核心问题是PowerShell的引号解析规则与FontForge脚本的字符串需求冲突:
- 直接嵌套双引号时,PowerShell会提前解析内部变量和引号,导致传给FontForge的脚本被截断,
);被错误识别为文件名的一部分。 - FontForge的
%n(字体名)、%e(扩展名)是自身占位符,必须原封不动传递,不能被PowerShell提前解析。
正确解决方案
方案1:字符串拼接法
通过单引号拼接PowerShell变量与FontForge脚本,确保FontForge需要的双引号和占位符正确传递:
$CurrentFile = $_ $FullNoExt = [IO.Path]::GetFileNameWithoutExtension($CurrentFile) $DestFolder = "$FullNoExt FontForge Export" if(!(Test-Path -LiteralPath $DestFolder -PathType Container)){ New-Item -Path $DestFolder -ItemType Directory -Force | Out-Null } # 拼接生成完整的FontForge脚本 $fontForgeScript = 'Open($1); SelectAll(); UnlinkReference(); Export("' + $DestFolder + '/%n-%e.svg");' fontforge -lang=ff -c $fontForgeScript $CurrentFile
方案2:Here-String(多行字符串)法
利用PowerShell的Here-String避免引号嵌套混乱,同时转义FontForge的$1变量(防止PowerShell误解析):
$CurrentFile = $_ $FullNoExt = [IO.Path]::GetFileNameWithoutExtension($CurrentFile) $DestFolder = "$FullNoExt FontForge Export" if(!(Test-Path -LiteralPath $DestFolder -PathType Container)){ New-Item -Path $DestFolder -ItemType Directory -Force | Out-Null } # Here-String定义脚本,`$1`转义避免PowerShell解析,$DestFolder正常替换 $fontForgeScript = @" Open(`$1); SelectAll(); UnlinkReference(); Export("$DestFolder/%n-%e.svg"); "@ fontforge -lang=ff -c $fontForgeScript $CurrentFile
错误原因说明
- 双引号嵌套错误:之前的尝试中,外层双引号包裹的FontForge脚本里,
Export("$DestFolder/%n-%e.svg");的内部双引号未转义,导致PowerShell提前截断字符串,FontForge收到的路径末尾多了);,因此报错找不到文件。 - 格式化运算符使用错误:PowerShell的
-f是字符串格式化运算符,需要直接作用于目标字符串,而非作为fontforge的命令参数,所以第二个尝试完全无法生效。
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

