You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因说明

  1. 双引号嵌套错误:之前的尝试中,外层双引号包裹的FontForge脚本里,Export("$DestFolder/%n-%e.svg");的内部双引号未转义,导致PowerShell提前截断字符串,FontForge收到的路径末尾多了);,因此报错找不到文件。
  2. 格式化运算符使用错误:PowerShell的-f是字符串格式化运算符,需要直接作用于目标字符串,而非作为fontforge的命令参数,所以第二个尝试完全无法生效。

内容的提问来源于stack exchange,提问作者fmotion1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:48:13