【问题标题】:Run powershell script as administrator via batch file with parameter passing通过带有参数传递的批处理文件以管理员身份运行 powershell 脚本
【发布时间】:2022-06-11 02:05:04
【问题描述】:

当我在没有管理员的情况下通过批处理文件运行脚本时,它会传递参数,但是当我以管理员身份运行脚本时,它不会传递参数。

我正在尝试下面链接中的命令,但没有成功:
run-script-within-batch-file-with-parameters

以管理员身份通过批处理文件执行脚本的命令:

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% 是要传递的参数。

错误信息:

No line:1 character:4
+ & {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolic ...
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand

powershell脚本中接收参数的命令:

Param(
     [decimal]$env:_vLUF
)

可能有什么问题,批处理文件中的命令还是 powershell 脚本中的命令?

Test:
当脚本执行时,不是管理员,通过批处理文件和powershell脚本中的参数定义为:

powershell中的参数:

Param(
     [decimal]$env:_vLUF
)

以管理员身份运行脚本的批处理文件中的命令:

powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1" %_vLUF%

注意:
无需将命名参数与目标参数名称一起使用。

结果:

结论:
当脚本运行时,无需管理员身份,通过批处理文件,即使脚本中使用的参数被定义为环境参数,它也可以正常工作,例如:[decimal]$env:_vLUF 并且无论参数值是否为负,例如:@ 987654332@.

为什么不以管理员身份运行脚本时,Powershell 会正确解释参数中的减号,而当以管理员身份运行时,它不能正确解释减号,这是我留给专家的问题!

不过,@mklement0 先生很好地回答了我的问题。

【问题讨论】:

  • 您的报价是个问题。在你的路径之前,你有一个双引号终止那里的第一个调用。
  • @Abraham Zinala 正确的方法是什么?
  • 转义引号(也提供它的结束引号),或转义路径中的空格。
  • @Abraham Zinala 我在路径的末尾加了双引号,是吗? "D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1"'
  • 查看 mklements 答案。

标签: powershell batch-file windows-10-universal powershell-5.0


【解决方案1】:

您的 .ps1 脚本的参数声明有缺陷

Param(
     [decimal]$env:_vLUF  # !! WRONG - don't use $env:
)

应该是:

Param(
     [decimal] $_vLUF  # OK - regular PowerShell variable
)

PowerShell 中的参数被声明为 常规 变量,而不是 环境 变量 ($env:)。

(虽然环境变量可以作为参数(参数)传递,另一种方法是直接在脚本正文中按名称引用它们。)


您的 PowerShell CLI 调用也有问题,即引用

请尝试以下方法:

powershell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -Verb RunAs powershell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \"D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1\" -_vLUF %_vLUF%'"

具体来说:

  • 嵌入 " 字符。使用 Windows PowerShell CLI (powershell.exe) 时,必须将其转义为 \" (原文如此);但是,鉴于%_vLUF% 代表[decimal],您根本不需要引用它。

    • 但是,您似乎遇到了一个 错误,该错误会影响至少 7.2.4 的 PowerShell 版本(截至撰写本文时为当前版本):如果参数以-,例如在负数 -11.0 中,-File CLI 参数总是将其解释为 参数名称 - 即使引用也无济于事。见GitHub issue #17519

    • 上面使用的解决方法是使用 named 参数,即在值前面加上目标参数名称:-_vLUF %_vLUF%

  • 顺便说一句:没有理由使用 & { ... } 来调用通过 -Command (-c) 参数传递给 PowerShell 的 CLI 的代码 - 只需直接使用 ...,如上所示。旧版本的 CLI documentation 错误地建议 & { ... } 是必需的,但这已得到纠正。

【讨论】:

  • 我使用了您发布的命令并将我的 powershell 脚本更改为:Param( [decimal]$_vLUF )。批处理文件中命令发送的值是11.0,但它在powershell脚本中接收为0。如何正确发送值?
  • 对不起,发送的值总是负数,所以发送的值是-11.0,好吗?
  • 这就是问题所在,@Clamarc - 它闻起来像是 PowerShell CLI 解析 -File 参数的方式的错误;请查看我的更新(更新后的命令本身和修改后的解释)。
  • 我在我的问题上发布了一个测试,通过批处理文件运行脚本,而不是以管理员身份通过批处理文件,您分析它会很有趣。
  • 另一个细节...执行脚本时powershell屏幕快速打开和关闭,有没有办法让这个屏幕不出现?
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 2016-10-25
  • 2013-01-16
  • 1970-01-01
  • 2014-07-26
  • 2015-04-17
  • 1970-01-01
  • 2012-10-06
相关资源
最近更新 更多