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

如何通过PowerShell的Start-Process给cmd.exe传命令(不同用户运行Groovy脚本)

问题描述

我需要以不同用户身份通过cmd.exe运行Groovy脚本。使用PowerShell的Start-Process执行后,仅以指定用户身份打开了命令提示符窗口,但并未执行$command变量指定的Groovy脚本。请问如何在PowerShell中启动cmd.exe时传递要执行的命令?

以下是我当前的代码:

$username = "abc" 
$pwd = ConvertTo -SecureString "xyz" -AsPlainText -Force 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username $pw 
$command = "filepath/.groovy" 
try { 
    Start-Process 'cmd' -Credential $cred -ArgumentList $command 
    Write-Host $LASTEXITCODE 
    if($LASTEXITCODE -ne 0) { 
        throw "Error occured" 
    } else { 
        return 0 
    } 
} catch { 
    Write-Error "Error Desc:$_Error.InnerException.Message"; 
}
解决方案

你的问题主要出在两个地方:一是给cmd.exe传递命令时缺少必要的启动参数,二是代码里存在语法和变量拼写错误,我来一步步帮你修正:

  1. cmd.exe的命令执行逻辑:
    要让cmd.exe执行指定命令,必须先传递/c(执行命令后自动关闭窗口)或者/k(执行命令后保持窗口打开,适合调试)参数,之后再跟上实际要执行的命令。如果直接传脚本路径,cmd.exe只会把它当作窗口标题,不会触发执行操作。

  2. 修正代码中的错误点:

    • ConvertTo -SecureString语法错误,应该写成ConvertTo-SecureString(连字符不能有空格);
    • 创建PSCredential对象时,第二个参数写错了变量名($pw应该是$pwd);
    • Catch块里的异常输出语法错误,正确的内部异常调用方式是$_.Exception.InnerException.Message;
    • 缺少-Wait参数,导致Start-Process会异步启动进程,无法正确获取脚本执行的退出码$LASTEXITCODE。
  3. Groovy脚本的执行命令:
    直接传递脚本路径不足以触发执行,需要调用groovy命令来启动脚本,同时如果脚本路径包含空格,要用双引号包裹避免解析错误。

修正后的完整代码如下:

$username = "abc" 
$pwd = ConvertTo-SecureString "xyz" -AsPlainText -Force 
# 修正变量拼写错误,确保参数匹配
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $pwd 
# 替换为你实际的Groovy脚本完整路径
$scriptPath = "C:\actual\path\to\your\script.groovy"
# 组合cmd需要执行的完整命令,处理路径含空格的情况
$cmdCommand = "groovy `"$scriptPath`""

try { 
    # 传递/c参数让cmd执行后退出,加上-Wait确保获取正确的退出码
    Start-Process 'cmd.exe' -Credential $cred -ArgumentList "/c", $cmdCommand -Wait
    Write-Host "Execution Exit Code: $LASTEXITCODE" 
    if($LASTEXITCODE -ne 0) { 
        throw "Error occurred while executing Groovy script" 
    } else { 
        return 0 
    } 
} catch { 
    Write-Error "Error Description: $_"
    # 输出内部异常信息便于排查问题
    if ($_.Exception.InnerException) {
        Write-Error "Inner Exception Details: $($_.Exception.InnerException.Message)"
    }
}

额外提示:

  • 如果需要调试脚本执行过程,可以把/c改成/k,这样执行完脚本后cmd窗口会保持打开,方便查看输出日志;
  • 确保目标用户有权限访问Groovy脚本的路径,以及groovy命令已经添加到系统环境变量中(否则需要写groovy.exe的完整路径)。

内容的提问来源于stack exchange,提问作者Rahul Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:58:24