这个PowerShell命令行引用/转义是什么?

时间:2010-10-08 11:53:07

标签: powershell msdeploy psake

我显然不知道自己在做什么。

我终于得到了这个PowerShell命令。但我无法弄清楚它为什么会起作用。

我担心的是最后的“”角色:

    &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
    -verb:sync `
    -source:contentPath="$build_directory\deploy" `
    -dest:contentPath="$server_temp_directory,computerName=$server,username=$server_username,password=$server_password" `
    -verbose `
    -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

为什么我需要双引号?

我的IDE(PowerGUI)表示该行未正确结束,但这是我可以按需运行命令的唯一方法。

是什么,我 - 和IDE - 不知道在PowerShell中引用?


来自echoargs的一点输出:

如果我跑:

echoargs -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

我明白了:

Arg 0 is <-postSync=runCommand=powershell -NoLogo -NoProfile -Command \remotetasks.ps1 Deploy>

如果我没有双引号,我得到:

Arg 0 is <-postSync=runCommand=powershell>
Arg 1 is <-NoLogo>
Arg 2 is <-NoProfile>
Arg 3 is <-Command>
Arg 4 is <\remotetasks.ps1>
Arg 5 is <Deploy>

另一件需要注意的事情是,只有在最后一个参数中使用=而不是:时,上述命令才有效。

这不起作用:

-postSync:runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

我尝试过这样的阵列解决方案:

$arguments = @("-verb:sync",
               "-source:contentPath=$build_directory\deploy",
               "-dest:contentPath=$server_temp_directory,computerName=$server,username=$server_username,password=$server_password",
               "-verbose",
               "-postSyncOnSuccess:runCommand=powershell -Command $server_temp_directory\remotetasks.ps1 Deploy")
&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" $arguments

我仍然得到同样的错误:

  

错误:无法识别的参数'“ - postSyncOnSuccess:runCommand = powershell -Command c:\ temp \ kslog \ remotetasks.ps1 Deploy”'。所有参数必须以“ - ”开头。

我在这里做错了吗?

3 个答案:

答案 0 :(得分:11)

这是一个臭名昭着的问题。票证“执行需要引号和变量的命令实际上是不可能的”是投票最多的错误:https://connect.microsoft.com/PowerShell/Feedback

您也可以找到一些解决方法。但我建议您将所有参数组合为数组并使用&运算符来调用此数组的本机命令。查看答案和示例: Running an EXE file using PowerShell from a directory with spaces in itExecuting a Command stored in a Variable from Powershell

我没有使用msdeploy.exe,也无法为您的案例提供一些演示代码。但是我很好地将这种方法应用于许多其他棘手的本机命令。请尝试一下,让我们知道结果。

P.S。从技术上讲,这不是你问题的答案,但我认为你仍然在寻找一种切实可行的方法,所以它仍然可能会有所帮助。

答案 1 :(得分:3)

我终于找到了如何做到这一点。这是一个示例脚本:

$src = 'C:\sandbox\Test Folder\A'
$dest = 'C:\sandbox\Test Folder\B'
$msdeploy = Get-Command 'C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe'
$command = "& `$msdeploy --% -verb:sync -source:contentPath=""$src"" -dest:contentPath=""$dest"""
$sb = $ExecutionContext.InvokeCommand.NewScriptBlock($command)
& $sb

答案 2 :(得分:1)

这里有一个缺点是PowerShell无法应对基于cmd的msdeploy中表示的“Program Files”之间的空格的转换。

这是一个非常基本的解决方案,并利用过时的DOS限制,但可以使用以下非空格引用:

\Program Files\ ... \Progra~1\
\Program Files (x86)\ ... \Progra~2\

这很蹩脚,但它确实有效。

您还可以创建一个调用cmd并执行命令的函数。此示例还假设您尝试调用的内容(msdeploy等)位于路径中。

function PushToTarget() {
     cmd.exe /C $("msdeploy.exe -verb:sync -source:apphostconfig=yourwebapp-dev -dest:archivedir=d:\backup")
}