Question

Je ne sais évidemment pas ce que je fais.

Je l'ai finalement obtenu cette commande PowerShell au travail. Mais je ne peux pas comprendre pourquoi cela fonctionne.

Ma préoccupation est la finale "" caractères:

    &"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""

Pourquoi ai-je besoin double double guillemets?

IDE Mon (PowerGUI) dit que la ligne ne se termine pas correctement, mais il est la seule façon que je peux faire la course de commande comme voulu.

Qu'est-ce que je - et l'IDE - ne savent pas citer dans PowerShell


Une petite sortie de echoargs:

Si je lance:

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

J'obtenir:

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

Si je cours sans les doubles guillemets doubles, je reçois:

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>

Une autre chose à noter est que la commande ci-dessus ne fonctionne que si elle utilise = au lieu de : dans le dernier argument.

Cela ne fonctionnera pas:

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

J'ai essayé la solution de tableau comme ceci:

$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

je reçois toujours la même erreur:

  

Erreur: Argument non reconnu "-postSyncOnSuccess: RunCommand = powershell -Command c: \ temp \ kslog \ remotetasks.ps1 Déployer". Tous les arguments doivent commencer par "-".

Suis-je faire une nouvelle chose ici mal?

Était-ce utile?

La solution

Ceci est un problème notoire. Le ticket « Exécution des commandes qui nécessitent des citations et des variables est pratiquement impossible » est le plus voté bug: https: // connect.microsoft.com/PowerShell/Feedback

Vous pouvez y trouver quelques solutions de contournement ainsi. Mais je vous recommande de composer tous les paramètres comme array et utilisez l'opérateur & pour invoquer une commande native avec ce tableau. Voir les réponses et des exemples: Exécution d'un fichier EXE en utilisant PowerShell à partir d'un répertoire contenant des espaces et Exécution d'une commande stockée dans une variable de Powershell

Je ne fonctionnait pas avec msdeploy.exe et ne peut pas fournir un code de démonstration pour votre cas. Mais j'ai appliqué cette approche à beaucoup d'autres commandes natives délicates assez bien. S'il vous plaît, essayez et faites-nous les résultats.

P.S. Techniquement ce n'est pas exactement une réponse à vos questions, mais je suppose que vous êtes toujours à la recherche d'un moyen pratique de le faire, il pourrait encore être utile.

Autres conseils

J'ai finalement trouvé comment faire. Voici un exemple de script:

$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

L'un des domaines fautifs est ici l'incapacité de PowerShell pour faire face à la traduction de l'espace entre les « Program Files » exprimé dans le msdeploy à base cmd.

Ceci est une solution extrêmement simple et tire parti des limites DOS vétuste, mais les références non-espaces blancs suivants peuvent être utilisés à leur place:

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

Il est nul, mais cela fonctionne.

Vous pouvez également créer une fonction qui appelle cmd et exécute votre commande. Cet exemple suppose aussi ce que vous essayez d'appeler (msdeploy, etc.) est dans le chemin.

function PushToTarget() {
     cmd.exe /C $("msdeploy.exe -verb:sync -source:apphostconfig=yourwebapp-dev -dest:archivedir=d:\backup")
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top