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
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
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%
essayez D'utiliser Start-Process pour lancer MSbuild puis passez le reste comme valeur avec-Argument.
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
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.