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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:19:31