Faites que PowerShell ignore le point-virgule

je veux exécuter un cmd sur PowerShell et cette commande utilise des points-virgule. PowerShell l'interprète alors comme plusieurs commandes. Comment faire pour que PowerShell ignore le point-virgule et exécute ma commande comment une commande unique?

exemple:

Invoke-Expression "msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=$TargetFolder $WebProject"

autre exemple:

Invoke-Expression "test`;test2"

et la réponse du deuxième exemple:

The term 'test' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:6
+ teste <<<< ;teste2
    + CategoryInfo          : ObjectNotFound: (teste:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

The term 'test2' is not recognized as the name of a cmdlet, function, script file, or operable program. Chec
k the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:13
+ teste;teste2 <<<<
    + CategoryInfo          : ObjectNotFound: (teste2:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
10
demandé sur Peter Mortensen 2012-04-13 00:09:20

5 réponses

comme alternative à Start-Process , vous pouvez simplement appeler la commande comme vous l'appelleriez de la même façon en utilisant cmd.exe utilisant l'opérateur d'appel & :

& msbuild /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=$TargetFolder $WebProject
2
répondu Andy Arismendi 2017-05-28 21:52:53

il suffit d'échapper au point-virgule sur la ligne de commande:

msbuild /t:Build`;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug`;_PackageTempDir=$TargetFolder $WebProject

je fais ça tout le temps avec la tf.exe utilitaire:

tf.exe status . /r /workspace:WORK`;johndoe

POUR INFORMATION, ce numéro de a été largement voté sur Connect . PowerShell v3 aborde cette question avec le nouvel opérateur --% :

$env:TargetFolder = $TargetFolder
msbuild $WebProject --% /t:Build;PipelinePreDeployCopyAllFilesToOneFolder /p:Configuration=Debug;_PackageTempDir=%TargetFolder%
22
répondu Keith Hill 2012-04-13 04:03:39

essayez D'utiliser Start-Process pour lancer MSbuild puis passez le reste comme valeur avec-Argument.

2
répondu Jeffery Hicks 2012-04-12 20:47:01

voici un exemple de la façon dont j'utilise pour appeler des fichiers exe natifs avec un usage et des paramètres commentés:

# Gen-CACert.ps1
clear-host

$scriptBlock = {.\Makecert -n `"CN=PowerShell Authorite de certification`"  <# Sujet du certificat (conforme à la norme X50 #>`
                           -a sha1                                          <# Algorithme utilisé #>`
                           -eku 1.3.6.1.5.5.7.3.3                           <# Option du certificat (signature de code) #>`
                           -r                                               <# Certificat auto signé #>`
                           <# -ss `"$($args[0])`"                              Dossier de stockage du certificat #>`
                           -ss `"root`"                                     <# Dossier de stockage du certificat #>`
                           -sr localMachine                                 <# Magasin de stockage localmachine ou currentuser (defaut) #>`
                           -sv `"$($args[0]).pvk`"                          <# Nom du fichier contenant la clef privée #>`
                           `"$($args[0]).cer`"}                             <# Nom du fichier certificat #>

$PoshCARoot = "PoshCARoot"
Invoke-Command -ScriptBlock $scriptBlock  -ArgumentList $PoshCARoot
1
répondu JPBlanc 2017-05-28 21:53:55

la façon la plus facile d'ignorer un point-virgule? Il suffit d'utiliser un seul devis versus un double devis!

dans PowerShell, le type de devis que vous utilisez importe. Une double citation permettra à PowerShell d'étendre la chaîne (donc si vous avez une variable $something = someprogram.exe, et exécutez la commande "$quelque chose", PowerShell substituts dans "someprogram.EXE.)"

si vous n'avez pas besoin de substitution de chaîne/expansion de variable, utilisez simplement les guillemets simples. PowerShell va exécuter chaînes de caractères à simple citation exactement comme indiqué.

une autre option si vous voulez utiliser l'extension string est d'utiliser une here-string à la place. Une chaîne ici est comme une chaîne régulière, mais elle commence et se termine par un @ sign sur sa propre ligne séparée, comme ceci:

$herestring = @"
Do some stuff here, even use a semicolon ;
"@

c'est un scénario du meilleur des deux mondes, car vous pouvez utiliser vos personnages fantaisistes et les faire fonctionner, mais tout de même obtenir l'expansion Variable, que vous ne recevez pas avec des guillemets simples.

1
répondu FoxDeploy 2017-05-28 21:55:08