这不是关于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'}"
关于我哪里出错的任何建议?
非常感谢
答案 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