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

NMAKE预处理器宏未展开:第二个PowerShell命令路径异常求助

问题原因

这是NMAKE的宏展开转义冲突导致的:

  • 第二个PowerShell命令中,$(DIR_DWNLOAD)\gettext64.zip里的反斜杠\紧跟在宏引用之后,被NMAKE误解析为宏引用的转义符,而非路径分隔符。
  • NMAKE会将$(DIR_DWNLOAD)\识别为试图转义宏的结束括号,导致宏内容被错误截断,最终只保留了\gettext64.zip部分,宏完全未展开。
  • 此外,第二个命令中Where{(无空格)的写法加剧了解析器混乱,进一步干扰了宏展开的正确性。

修复方案

方案一:明确宏边界,避免转义冲突

在宏引用后添加空格,让NMAKE清晰识别宏的边界,PowerShell会自动忽略路径中的多余空格:

!ELSE
    powershell -nologo -noprofile -command \
        Add-Type -AssemblyName 'System.IO.Compression.FileSystem'; \
        $$zfl=[System.IO.Compression.ZipFile]::OpenRead(\"$(DIR_DWNLOAD) \gettext32.zip\"); \
        $$zfl.Entries ^| Where {$$_.Name -like '*.dll'} ^| \
        foreach {[System.IO.Compression.ZipFileExtensions]::ExtractToFile($$$_, \"$(DIR_GETTEXT32) \$$($$$_.Name)\",$$$true)}; \
        $$zfl.Dispose()
    powershell -nologo -noprofile -command \
        Add-Type -AssemblyName 'System.IO.Compression.FileSystem'; \
        $$zfl=[System.IO.Compression.ZipFile]::OpenRead(\"$(DIR_DWNLOAD) \gettext64.zip\"); \
        $$zfl.Entries ^| Where {$$_.Name -like '*.dll'} ^| \
        foreach {[System.IO.Compression.ZipFileExtensions]::ExtractToFile($$$_, \"$(DIR_GETTEXT64) \$$($$$_.Name)\",$$$true)}; \
        $$zfl.Dispose()
!ENDIF

方案二:提前定义完整路径变量(推荐)

在!ELSE分支前,提前拼接好zip文件路径和目标路径,从根源上避免宏与反斜杠的直接拼接:

!ELSE
    # 提前定义完整路径,避免宏与反斜杠直接拼接
    ZIP_FILE32 = $(DIR_DWNLOAD)\gettext32.zip
    ZIP_FILE64 = $(DIR_DWNLOAD)\gettext64.zip
    TARGET_DIR32 = $(DIR_GETTEXT32)
    TARGET_DIR64 = $(DIR_GETTEXT64)

    powershell -nologo -noprofile -command \
        Add-Type -AssemblyName 'System.IO.Compression.FileSystem'; \
        $$zfl=[System.IO.Compression.ZipFile]::OpenRead(\"$(ZIP_FILE32)\"); \
        $$zfl.Entries ^| Where {$$_.Name -like '*.dll'} ^| \
        foreach {[System.IO.Compression.ZipFileExtensions]::ExtractToFile($$$_, \"$(TARGET_DIR32)\$$($$$_.Name)\",$$$true)}; \
        $$zfl.Dispose()
    powershell -nologo -noprofile -command \
        Add-Type -AssemblyName 'System.IO.Compression.FileSystem'; \
        $$zfl=[System.IO.Compression.ZipFile]::OpenRead(\"$(ZIP_FILE64)\"); \
        $$zfl.Entries ^| Where {$$_.Name -like '*.dll'} ^| \
        foreach {[System.IO.Compression.ZipFileExtensions]::ExtractToFile($$$_, \"$(TARGET_DIR64)\$$($$$_.Name)\",$$$true)}; \
        $$zfl.Dispose()
!ENDIF

该方案不仅解决了转义问题,还让代码结构更清晰,便于维护。

另外,建议统一将Where{改为Where {(添加空格),保持代码风格一致,避免解析器出现不必要的异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:48:12