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

问题描述 投票:12回答:3

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

我终于得到了这个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”'。所有参数必须以“ - ”开头。

我在这里做错了吗?

powershell msdeploy psake
3个回答
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,也无法为您的案例提供一些演示代码。但是我很好地将这种方法应用于许多其他棘手的本机命令。请尝试一下,让我们知道结果。

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


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

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")
}
© www.soinside.com 2019 - 2024. All rights reserved.