使用 .bat 通过 Powershell 运行另一个 .bat,参数中包含空格

问题描述 投票:0回答:1

我正在尝试获取一个批处理文件以使用 Powershell 运行另一个批处理文件:

a.bat

POWERSHELL Start-Process -FilePath b.bat -ArgumentList 'a b','c d' -verb runas >nul 2>&1

b.bat

ECHO %1
ECHO %2
ECHO %3
ECHO %4
ECHO %*
SET /P=Press enter to exit...

我尝试了各种参数列表,但我无法传递带空格的参数。这是我根据我的尝试观察到的结果。希望其中至少有一些是错误的。

  • 所有空格和逗号都用于分隔参数。它们保留在
    %*
    中,但不包含在任何单个参数中。
  • 整个参数列表或每个带有空格的部分,如果有空格,必须用单引号引起来。除此之外,所有单引号和双引号都被删除。
  • 反引号 ` 被解释为普通字符,并且不会转义引号。
  • 单反斜杠会使脚本崩溃,双反斜杠被解释为正常的单反斜杠字符。

以下是我对论证列表的一些尝试,这些列表说明了上述内容:

  • '"a b","c d"'
  • '"a b" "c d"'
  • '`"a b`"'
  • '"`"a b`""'
  • '`""a b"`"'
  • '\\"a b\\"'
  • '\"a b\"'
    - 错误
  • '`'a b`''
    - 错误

如何传递带有空格的参数列表?

上下文:我的目标是运行一个 .bat,它使用参数调用另一个 .bat,然后使用 Powershell 以管理员权限调用自身,同时保留参数。我已经让它工作了,除非参数有空格。

powershell batch-file
1个回答
0
投票

使用双引号传递字符串值,然后使用

~
去除批处理脚本中的引号参数:

ECHO %~1
ECHO %~2
ECHO %*
SET /P=Press enter to exit...

然后:

Start-Process .\b.bat -ArgumentList '"a b"', '"c d"'

或者,直接调用脚本并让 PowerShell 负责引用参数:

# use splatting, let PowerShell handle argument quoting
$batchArgs = @('a b', 'c d')
& .\b.bat @batchArgs
© www.soinside.com 2019 - 2024. All rights reserved.