如何通过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传递命令时缺少必要的启动参数,二是代码里存在语法和变量拼写错误,我来一步步帮你修正:
cmd.exe的命令执行逻辑:
要让cmd.exe执行指定命令,必须先传递/c(执行命令后自动关闭窗口)或者/k(执行命令后保持窗口打开,适合调试)参数,之后再跟上实际要执行的命令。如果直接传脚本路径,cmd.exe只会把它当作窗口标题,不会触发执行操作。修正代码中的错误点:
ConvertTo -SecureString语法错误,应该写成ConvertTo-SecureString(连字符不能有空格);- 创建
PSCredential对象时,第二个参数写错了变量名($pw应该是$pwd); - Catch块里的异常输出语法错误,正确的内部异常调用方式是
$_.Exception.InnerException.Message; - 缺少
-Wait参数,导致Start-Process会异步启动进程,无法正确获取脚本执行的退出码$LASTEXITCODE。
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
相关产品推荐
相关产品推荐

