批处理以管理员身份运行PowerShell脚本参数传递异常问题
批处理提权运行PowerShell脚本参数传递异常问题
问题现象
- 以普通用户权限通过批处理调用PowerShell脚本时,传入参数可被正常接收;同脚本通过命令提权为管理员运行时,参数无法正常传递。
- 调整命令写法后问题仍未解决,当前使用的提权批处理命令如下:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File "D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1' '%_vLUF%' -Verb RunAs}"
- 命令中
%_vLUF%为待传递的目标参数,执行后直接抛出参数绑定错误:
所在位置 行:1 字符: 4 + & {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolic ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
- 脚本内接收参数的代码定义如下:
Param( [decimal]$env:_vLUF )
复现测试
普通权限运行场景下,脚本参数定义与提权场景完全一致,使用的批处理执行命令为:
powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1" %_vLUF%
测试结论:普通权限场景下无需为目标参数指定命名参数即可正常传值,即使参数值为负数(如
-11.0)、参数定义为环境变量形式[decimal]$env:_vLUF,脚本也可正常运行。
故障原因
报错来自两个叠加的解析问题:
- 引号转义错误:当前命令中
-ArgumentList后的字符串嵌套了双引号包裹带空格的脚本路径,但未做正确转义,导致PowerShell拆分参数列表时,把本该属于Start-Process的参数-Verb RunAs识别成了要传给目标脚本的参数,直接触发参数绑定异常。 - 负号解析规则差异:直接调用
powershell.exe -File时,解析逻辑会把-File参数后的第一个字符串识别为脚本路径,后续所有内容按位置顺序绑定给脚本参数,哪怕值以-开头,也会被当作参数值处理,不会误判为参数开关;但通过Start-Process嵌套启动提权进程时,如果-ArgumentList传的是一整段拼接的字符串,会经过二次解析,以-开头的负数值会被误识别为新的参数开关,导致传参失败。
修复方案
将提权运行的批处理命令替换为如下写法,通过分段传参的方式给ArgumentList传值,从根源避免引号转义混乱,同时自动规避负号被误判的问题:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process PowerShell -ArgumentList '-NoProfile','-ExecutionPolicy','Bypass','-File','D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1','%_vLUF%' -Verb RunAs"
优化建议:脚本中直接使用[decimal]$env:_vLUF作为参数定义不符合PowerShell常规写法,建议改为普通位置参数param([decimal]$vLUF),在脚本内部按需将值赋值给对应环境变量,可进一步降低不同场景下的参数解析异常概率。
内容的提问来源于stack exchange,提问作者Clamarc
相关产品推荐
相关产品推荐

