如何在 windows cmd 中正确使用变量替换?

Posted

技术标签:

【中文标题】如何在 windows cmd 中正确使用变量替换?【英文标题】:How to properly use variable substitutions in windows cmd? 【发布时间】:2019-10-19 02:58:39 【问题描述】:

我正在使用 Ghost Script 来操作 PDF。我使用数字变量作为参数。我的输入文件名是“x.pdf”。我希望输出文件为“x-processed.pdf”。目前我有上面提到的代码:

gswin64c.exe -q -dNOPAUSE -dBATCH -dSAFER -dPDFA=2 -dPDFACompatibilityPolicy=1 -dSimulateOverprint=true -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150 -sOutputFile=%1%-processed.pdf -c .setpdfwrite -f %1

所以输出文件名当前是inputfilename.pdf-processed.pdf。 我想删除那个扩展。但我不知道怎么做。

我在这里尝试使用变量替换形式:http://cplusplus.bordoon.com/cmd_exe_variables.html 也就是说,我把-sOutputFile=%1-processed.pdf改成了-sOutputFile=%~pn1-processed.pdf

那没用。

所以我首先尝试研究如何使用这些替换。我尝试通过 regedit 添加此命令,将选定的文件名复制到剪贴板: cmd.exe echo "%~n1"|clip 那是行不通的。 但如果我简单地说: cmd.exe /c echo "%1"|clip 这可以正常工作并将带有扩展名的文件路径复制到剪贴板。

我真的被困住了,因为我不明白我在这里做错了什么。请帮帮我。

没有错误消息。根本没有消息。什么都没有发生。

【问题讨论】:

-sOutputFile=%1%-processed.pdf -c .setpdfwrite -f %1 转换为 -sOutputFile=%11,因为变量 %-processed.pdf -c .setpdfwrite -f % 为空。 (换句话说,你的% 太多了) 事实上它适用于 %1% 和 %1。但我不使用 %~pn1 ,这就是问题所在。我想在重命名时摆脱文件扩展名。 "事实上,它对 %1% 和 %1 都有效" - 它没有。尝试 echo <your whole line>sOutputFile=%1%-processed.pdfsOutputFile=%1-processed.pdf 并比较输出。 很抱歉,但我不知道这条线在 echo 下应该是什么样子。你介意精确一下吗?我认为它不应该工作。但从技术上讲,它会在 %1% 和 %1 两种情况下创建一个新的 pdf。这很奇怪,但我已经测试过,两者都做同样的事情。问题更多的是为什么 %~dn1 不起作用? 您使用了错误的术语。打开命令提示符窗口并运行set /?。输出帮助解释了如何使用环境变量进行替换。您要使用的是使用修饰符引用批处理文件的第一个参数。在 cmd 窗口中运行的帮助输出 call /? 解释了如何执行此操作。 %~pn1 表示第一个参数的路径和名称,没有驱动器和文件扩展名。我建议使用-sOutputFile="%~dpn1-processed.pdf" -c .setpdfwrite -f "%~1",即使在调用具有糟糕文件名"Test & Example_#1!.pdf" 的批处理文件时也绝对有效。 【参考方案1】:

事实上,当从上下文菜单中输入 shell 命令时,可用的变量很少。 更多信息在https://superuser.com/a/473602。

所以唯一的办法就是用上面提到的代码创建一个批处理文件:

C:\Program Files (x86)\gs\gs9.27\bin\gswin32c.exe" -q -dNOPAUSE -dBATCH -dSAFER -dPDFA=2 -dPDFACompatibilityPolicy=1 -dSimulateOverprint=true -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150 -sOutputFile="%~dpn1-processed.pdf" -c .setpdfwrite -f "%~1"

并添加以下命令REG_SZ行而不是直接输入命令:

"Path_to_bat_file/file_name.bat" "%1"

它应该可以工作。

【讨论】:

以上是关于如何在 windows cmd 中正确使用变量替换?的主要内容,如果未能解决你的问题,请参考以下文章

windows环境变量如何在cmd中打印

Windows如何在cmd命令行中查看、修改、删除与添加、设置环境变量?

java jdk 环境变量配置配置正确,但是在CMD中运行java命令后啥都没出现

如何在cmd下面写php代码

windows7adv丢失都有哪些原因

如何使cmd窗口正确显示utf-8编码的文字