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

PowerShell中Start-Process调用cmd.exe时无法正确传递参数问题

问题原因

你遇到的问题来自两个独立的错误:

  1. CMD位置参数的适用场景错误
    %1、%2这类带百分号的位置占位符,仅在运行.bat/.cmd批处理脚本时生效,用来指代调用批处理时传入的第N个参数。直接打开的交互式CMD窗口没有运行批处理的上下文,手动输入echo %1只会输出字面量%1,属于正常行为。
  2. PowerShell嵌套调用的参数传递错误
    就算你要给启动的CMD进程传入参数,现有命令的转义和调用逻辑也有问题:
  • 调用cmd.exe时如果要传入执行指令或者参数,必须搭配/c(指令执行完自动关闭窗口)或/k(指令执行完保留窗口)启动参数,否则跟在后面的字符串不会被CMD识别为传入参数。
  • 嵌套Start-Process的ArgumentList存在引号转义问题:外层调用powershell.exe时传入的双引号字符串中,内层的单引号会被新启动的PowerShell进程解析后丢弃,最终传给cmd.exe的参数实际为空。

修复方案

方案1:直接把要执行的命令作为CMD启动参数传入

如果你只是要启动CMD后自动打印value,可以直接用以下修正后的命令:

$username = 'Username'
$password = 'Password'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process powershell.exe -Credential $credential -WindowStyle Hidden -ArgumentList "Start-Process cmd.exe -Verb RunAs -ArgumentList '/k echo value'"

启动的CMD窗口会自动打印value,之后保留交互状态。

方案2:把值存入环境变量供后续调用

如果你需要在CMD的后续操作中反复使用这个值,可以把它写入环境变量:

$username = 'Username'
$password = 'Password'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process powershell.exe -Credential $credential -WindowStyle Hidden -ArgumentList "Start-Process cmd.exe -Verb RunAs -ArgumentList '/k set INPUT_VALUE=value'"

之后在打开的CMD窗口中输入echo %INPUT_VALUE%即可输出value。

内容的提问来源于stack exchange,提问作者Mario Palumbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:00