如何在 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.pdf
和 sOutputFile=%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命令行中查看、修改、删除与添加、设置环境变量?