Psexec批处理For循环报错求助:本地正常远程执行提示管道符异常
解决PsExec远程执行批处理时"| was unexpected"错误
这个问题我之前也碰到过,核心原因是远程命令传递时的特殊字符解析冲突。当你通过PsExec把命令发送到远程机器的cmd.exe时,本地的命令解释器会先处理一部分特殊符号(比如管道符|、引号),导致远程机器收到的命令已经被篡改,无法正确解析。
具体原因分析
你本地的命令里用了^|来转义管道符,让它在for /f的in()语句中生效。但通过PsExec传递时,本地cmd会先把^|解析成|,远程机器收到的命令里,这个|就脱离了in()的单引号范围,被当成了整个for命令之外的管道符,自然会抛出"At this point | was unexpected"的错误。
解决方案
方案1:双重转义特殊字符
在批处理中对管道符和引号进行双重转义,确保它们能正确传递到远程cmd环境。修改后的命令如下:
psexec.exe \\%pc% cmd.exe /k "for /f \"tokens=2 delims=:\" %%g in ('certutil -verifystore My ^^| findstr /i \"serial\"') do echo %%g"
\":转义双引号,避免本地cmd提前截断命令字符串^^|:第一层^被本地cmd解析后,剩下^|传递到远程cmd,远程cmd再将其解析为|,这样管道符就能在for /f的in()语句内正常工作
方案2:上传批处理文件到远程执行
如果觉得转义太麻烦,更简单的方法是把你的代码保存为本地批处理文件(比如GetCertSerial.bat),然后用PsExec的-c参数把文件复制到远程机器再执行:
psexec.exe \\%pc% -c GetCertSerial.bat
这种方式完全和本地执行效果一致,不需要处理任何转义问题,推荐在复杂命令场景下使用。
方案3:尝试用单引号包裹命令(可选)
某些环境下,用单引号把整个命令括起来也能避免本地解析,但cmd对单引号的支持有限,仅供尝试:
psexec.exe \\%pc% cmd.exe /k 'for /f "tokens=2 delims=:" %%g in ('certutil -verifystore My ^| findstr /i "serial"') do echo %%g'
测试一下修改后的命令,应该就能正常提取远程机器上的证书序列号了。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

