web-dev-qa-db-fra.com

Puis-je obtenir && pour travailler à Powershell?

&& est notoirement difficile à rechercher sur Google, mais le meilleur que j'ai trouvé est cet article qui dit d'utiliser -and.

Malheureusement, cela ne donne pas plus d'informations, et je ne peux pas savoir ce que je suis censé faire avec -and (encore une fois, chose notoirement difficile à rechercher)

Le contexte dans lequel j'essaie de l'utiliser est "execute cmd1, et en cas de succès, exécutez cmd2", en gros ceci:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

Cela devrait être un facile quelques points de rep à quelqu'un qui sait, merci!


Edit: Si vous voulez seulement exécuter plusieurs commandes sur une seule ligne et que vous ne vous souciez pas de savoir si la première échoue ou pas, vous pouvez utiliser ;.

Par exemple: kill -n myapp; ./myapp.exe

121
Orion Edwards

Dans CMD, '&&' signifie "exécuter la commande 1 et, le cas échéant, exécuter la commande 2". Je l'ai utilisé pour des choses comme:

build && run_tests

Dans PowerShell, la chose la plus proche que vous puissiez faire est la suivante:

(build) -and (run_tests)

La logique est la même, mais le texte de sortie des commandes est perdu. Peut-être que c'est assez bon pour vous, cependant.

MODIFIER

Si vous faites cela dans un script, vous ferez probablement mieux de séparer les instructions, comme ceci:

build
if ($?) {
    run_tests
}
107
Jay Bazuzi

&& et || étaient sur la liste des choses à mettre en œuvre (sont toujours) mais ne sont pas apparues comme la prochaine chose la plus utile à ajouter. La raison en est que nous avons -AND et -OU . Si vous pensez que cela est important, soumettez une suggestion sur Connect et nous l'examinerons pour la V3.

27
Jeffrey Snover - MSFT

Essaye ça:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
10
Ivan

Si votre commande est disponible dans cmd.exe (quelque chose comme python ./script.py mais pas une commande PowerShell comme ii . (cela signifie que vous ouvrez le répertoire actuel avec Explorer)), vous pouvez exécuter cmd.exe dans PowerShell. La syntaxe est la suivante:

cmd /c "command1 && command2"

Ici, && est fourni par la syntaxe cmd décrite dans cette question .

3
Tomoyuki Aota

Très vieille question, mais pour les nouveaux venus: peut-être que la version de PowerShell (similaire mais non équivalente) que la question recherche, est le point-virgule. Comme indiqué ci-dessus, la manière d'utiliser && sans perdre le résultat est la suivante:

build_command; run_tests_command

1
Francisco Serrano

J'ai essayé cette séquence de commandes dans PowerShell:

Premier test

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null) a renvoyé true et (Get-Content $MyVar) a également renvoyé true .

Deuxième test

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null) renvoyé false et jusqu'à présent, je dois supposer que le (Get-Content $MyVar) a également renvoyé false .

Le troisième test a prouvé que la deuxième condition n’avait même pas été analysée.

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null) a renvoyé false et a prouvé que la deuxième condition (Get-Content "C:\MyTxt.txt") ne s'exécutait jamais en renvoyant false sur la commande entière.

1
Cleber Machado

Je pense qu'une simple déclaration peut accomplir cela. Une fois que j'ai vu la réponse de mkelement0 ci-dessus, le dernier statut de sortie est stocké dans $?

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

Donc, pour l'exemple de l'op, ce serait:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }
0
slugman

Généralement, sous Linux, je ferais quelque chose comme: Ruby -c learn.rb && foodcritic learn.rb

Cependant, sur Windows PS, ne peut pas le faire! J'ai donc fini par créer un fichier .ps1 avec ceci:

Param(
  [string]$fileName
)

Ruby -c $fileName
foodcritic $fileName

et l'a appelé bamemeril.ps1

PS C:\Users\riotc> .\bamemeril.ps1 learn.rb
Syntax OK
Checking 1 files
x
FC011: Missing README in markdown format: ../README.md:1
FC031: Cookbook without metadata.rb file: ../metadata.rb:1
FC071: Missing LICENSE file: ../LICENSE:1
PS C:\Users\riotc>
0
Lance Robbins

Un équivalent prolixe est de combiner $LASTEXITCODE et -eq 0

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

Je ne sais pas pourquoi if ($?) n'a pas fonctionné pour moi, mais celui-ci l'a fait.

0
TankorSmash