参数列表无法在scriptblock

时间:2018-02-13 10:40:07

标签: powershell-v3.0

这不是关于Visual Studio的帖子,因为我可以在powershell命令行上复制问题

我正在尝试在Visual Studio 2015中启动powershell脚本作为postbuild事件的一部分。为了完整性,我的postbuild事件代码是:

powershell -executionPolicy bypass -Command  “& {Invoke-command -scriptblock {Param($path); write-host $path} -ArgumentList '$(ProjectDir)'}"

然后由VS将其转换为批处理文件:

powershell -executionPolicy bypass -Command  “& {Invoke-command -scriptblock {Param($path); write-host $path} -ArgumentList 'd:\somepath\somefile.msi'}"

它的目的是反驳开发人员在不同驱动器上彼此拥有数据的事实,因此我不知道脚本最终会在哪里生存。我将在路径字符串的开头使用音量信息但是,现在,让它回显路径将是一个胜利..

如果我使用Invoke-Command并运行它,那么所有工作都按预期工作:

PS D:\> Invoke-command -scriptblock {Param($path); write-host $path} -ArgumentList 'd:\somepath\somefile.msi'

d:\somepath\somefile.msi 

如果我将它包装到一个-command参数中以传递给powershell,那么参数列表永远不会填充参数,我在scriptblock中得到一个null $ path字符串。

PS D:\ > powershell -Command “& {Invoke-command -scriptblock {Param($path); write-host $path} -ArgumentList 'd:\somepath\somefile.msi'}"

关于我哪里出错的任何建议?

非常感谢

2 个答案:

答案 0 :(得分:1)

是否需要Invoke-Command cmdlet?我相信该命令用于远程处理(在远程机器上执行命令)。

查看PowerShell.exe语法,我看不到对ArgumentList参数的任何引用:

PowerShell[.exe] [-PSConsoleFile <file> | -Version <version>]
    [-NoLogo] [-NoExit] [-Sta] [-Mta] [-NoProfile] [-NonInteractive]
    [-InputFormat {Text | XML}] [-OutputFormat {Text | XML}]
    [-WindowStyle <style>] [-EncodedCommand <Base64EncodedCommand>]
    [-ConfigurationName <string>]
    [-File <filePath> <args>] [-ExecutionPolicy <ExecutionPolicy>]
    [-Command { - | <script-block> [-args <arg-array>]
                  | <string> [<CommandParameters>] } ]

有一个args参数,但我无法让它工作。我真的不确定它的目的是将参数值传递给PowerShell命令。我会这样做的方式是......

1)创建一个ps1文件:

param (
    $Path
)
Write-Host $Path

2)使用以下批处理文件启动ps1脚本:

powershell -file .\test.ps1 -path 'C:\Test'

希望这是您的方案的兼容解决方案。

答案 1 :(得分:0)

根据@Michaeljames的建议审查了我的-Command用法后,很明显我可能混合了两种不同的方法。

按如下方式更正我的代码具有所需的效果:

PS H:\> powershell -Command {param([string]$path) write-host "$($path.substring(0,1)):\Scripts\somescript.ps1"} -Args 'd:\somepath\somefile.msi'

D:\Scripts\somescript.ps1