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

PowerShell远程执行批处理遇「(. was unexpected at this time」错误求助

解决PowerShell远程执行批处理If-Else块的语法错误问题

这个. was unexpected at this time.错误是典型的CMD批处理语法问题,结合你远程执行的场景,问题根源有两个:一是原If判断的写法在参数为空时会触发CMD语法错误,二是PowerShell远程会话会预解析批处理中的%变量,干扰CMD的正常执行。下面是具体的解决方案:

1. 修复If-Else的判断逻辑(核心修改)

原代码中if [%prop_arg%] == []的写法存在缺陷:当%prop_arg%为空时,这条语句会被CMD解析成if [] == [] (,这完全不符合CMD的语法规范,直接触发报错。

你可以替换为两种更健壮的CMD兼容写法:

方式一:检查变量是否未定义

if not defined prop_arg (
    @rem if nothing then use default value
    echo Running Execution for '%USERID%' on %DATE% >> %CURRENT_DIR%\Logs\%LOG_FILE%
    echo. >> %CURRENT_DIR%\Logs\%LOG_FILE%
    echo GEM list: >> %CURRENT_DIR%\Logs\%LOG_FILE%
    gem list >> %CURRENT_DIR%\Logs\%LOG_FILE%
    ruby %CURRENT_DIR%\testscript.rb %CURRENT_DIR%\framework_properties.txt 2>&1 | tee -a %CURRENT_DIR%\Logs\%LOG_FILE%
) else (
    echo Using properties file: %prop_arg%
    ruby %CURRENT_DIR%\testscript.rb %CURRENT_DIR%\%prop_arg% 2>&1 | tee -a %CURRENT_DIR%\Logs\%LOG_FILE%
)

方式二:检查变量值是否为空字符串

if "%prop_arg%"=="" (
    @rem if nothing then use default value
    echo Running Execution for '%USERID%' on %DATE% >> %CURRENT_DIR%\Logs\%LOG_FILE%
    echo. >> %CURRENT_DIR%\Logs\%LOG_FILE%
    echo GEM list: >> %CURRENT_DIR%\Logs\%LOG_FILE%
    gem list >> %CURRENT_DIR%\Logs\%LOG_FILE%
    ruby %CURRENT_DIR%\testscript.rb %CURRENT_DIR%\framework_properties.txt 2>&1 | tee -a %CURRENT_DIR%\Logs\%LOG_FILE%
) else (
    echo Using properties file: %prop_arg%
    ruby %CURRENT_DIR%\testscript.rb %CURRENT_DIR%\%prop_arg% 2>&1 | tee -a %CURRENT_DIR%\Logs\%LOG_FILE%
)

2. 避免PowerShell远程的变量预解析干扰

PowerShell远程执行时,会尝试解析批处理中的%VAR%格式变量,导致CMD拿到的命令已经被篡改。解决这个问题的方法是启用CMD的延迟扩展:

在批处理文件开头添加setlocal enabledelayedexpansion,然后把所有%VAR%替换为!VAR!,确保变量在CMD环境下才被解析:

@echo off
setlocal enabledelayedexpansion

@rem 假设CURRENT_DIR、LOG_FILE、USERID等变量已提前设置

if not defined prop_arg (
    echo Running Execution for '!USERID!' on !DATE! >> !CURRENT_DIR!\Logs\!LOG_FILE!
    echo. >> !CURRENT_DIR!\Logs\!LOG_FILE!
    echo GEM list: >> !CURRENT_DIR!\Logs\!LOG_FILE!
    gem list >> !CURRENT_DIR!\Logs\!LOG_FILE!
    ruby !CURRENT_DIR!\testscript.rb !CURRENT_DIR!\framework_properties.txt 2>&1 | tee -a !CURRENT_DIR!\Logs\!LOG_FILE!
) else (
    echo Using properties file: !prop_arg!
    ruby !CURRENT_DIR!\testscript.rb !CURRENT_DIR!\!prop_arg! 2>&1 | tee -a !CURRENT_DIR!\Logs\!LOG_FILE!
)

endlocal

3. 远程执行时显式调用CMD.exe

不要直接在PowerShell远程脚本块中运行批处理文件,而是通过cmd.exe /c显式启动CMD环境执行批处理,确保整个逻辑在CMD上下文运行:

Invoke-Command -ComputerName YourServerName -ScriptBlock {
    @# 替换为你的批处理实际路径和参数
    cmd.exe /c "D:\YourScriptPath\your_batch_file.bat" "optional_prop_arg"
}

补充说明

关于tee命令:CMD原生没有tee,你本地执行正常可能是因为环境中安装了GNU工具(比如Git Bash附带的)。如果远程服务器没有这个工具,可以用>>写入日志后,再用type命令输出日志内容来替代tee的实时输出效果。

内容的提问来源于stack exchange,提问作者My Display Name

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:04:35