.bat文件中调用PowerShell命令时百分号(%)失效的问题咨询
.bat文件中调用PowerShell命令时百分号(%)失效的问题咨询
我懂你的好奇点!你已经有替代方案,但就是想搞明白怎么让这段批处理里的PowerShell命令正常运行,对吧?
先看看你遇到问题的代码:
REM RUN FROM A .BAT FILE FOR /F "DELIMS=" %%A IN ('POWERSHELL -C "Get-Date -UFormat "%Y-%m-%d_(%I.%M%p)""') DO SET "CUR_DATE=%%A" ECHO %CUR_DATE%
问题根源在于批处理里的百分号%是特殊字符,它用来引用批处理变量(比如%CUR_DATE%)。当你在PowerShell的-UFormat参数里直接写%Y、%m这些格式符时,批处理会把它们当成自己的变量解析,直接把这些%处理掉,传到PowerShell的命令就变样了,自然无法正常执行。
你试了各种符号组合,其实核心就是要让批处理把这些%原封不动传给PowerShell,这里有两个可行的解决方法:
方法一:用双重百分号%%转义
在批处理语法里,要输出一个单独的%,就需要写两个%%。把你PowerShell命令里的每个%都替换成%%即可:
FOR /F "DELIMS=" %%A IN ('POWERSHELL -C "Get-Date -UFormat "%%Y-%%m-%%d_(%%I.%%M%%p)""') DO SET "CUR_DATE=%%A"
这样批处理解析时,会把每个%%转换成一个%传给PowerShell,PowerShell就能正确识别-UFormat的格式字符串了。
方法二:调整引号嵌套方式
批处理对单引号包裹的内容解析限制更少,我们可以把PowerShell命令用单引号括起来,内部的格式字符串保留双引号:
FOR /F "DELIMS=" %%A IN ('POWERSHELL -C 'Get-Date -UFormat "%Y-%m-%d_(%I.%M%p)"'') DO SET "CUR_DATE=%%A"
这种写法能避免批处理解析内部的%符号,直接把完整的格式字符串传给PowerShell。
你提到已经有替代方案,大概率是用了PowerShell的-Format参数(比如Get-Date -Format "yyyy-MM-dd_(hh.mmtt)"),这种写法不需要%,自然避开了批处理的符号冲突,但上面两种方法能让你原本的命令正常工作哦!
备注:内容来源于stack exchange,提问作者Harminoff
相关产品推荐
相关产品推荐

