&&
est notoirement difficile à rechercher sur la recherche Google, mais le meilleur que j'ai trouvé est cet article qui dit à utiliser -and
.
Malheureusement, cela ne donne plus d'informations et je ne peux pas savoir ce que je suis censé faire -and
(encore une fois, une chose notoirement difficile à rechercher).
Le contexte dans lequel j'essaie de l'utiliser est "exécuter cmd1, et en cas de succès, exécuter cmd2", en gros ceci:
csc /t:exe /out:a.exe SomeFile.cs && a.exe
Si vous souhaitez simplement exécuter plusieurs commandes sur une seule ligne et que vous ne vous souciez pas de savoir si la première échoue ou non, vous pouvez utiliser ;
Pour la plupart de mes besoins, cela convient.
Par exemple: kill -n myapp; ./myapp.exe
.
syntax
powershell
Orion Edwards
la source
la source
&&
et||
devient membre de PowerShell: veuillez voter pour la fonctionnalité ici .!sym
.&&
et||
! Pesée au GitHub PRRéponses:
Dans CMD, '&&' signifie "exécuter la commande 1, et si elle réussit, exécuter la commande 2". Je l'ai utilisé pour des choses comme:
Dans PowerShell, la chose la plus proche que vous pouvez faire est:
Il a la même logique, mais le texte de sortie des commandes est perdu. Peut-être que c'est assez bon pour vous, cependant.
Si vous faites cela dans un script, vous ferez probablement mieux de séparer les instructions, comme ceci:
build if ($?) { run_tests }
2019/11/27 : L'
&&
opérateur est désormais disponible pour PowerShell 7 Preview 5+ :PS > echo "Hello!" && echo "World!" Hello! World!
la source
build ; if ($?) { run_tests }
sur la ligne de commande.bash
idées à PowerShell. C'est la fonctionnalité de base du shell. Jusqu'à présent, le meilleur que j'ai vu est celuibuild ; if ($?) { run_tests }
que j'utiliserai à partir de maintenant. J'espère que l'équipe PowerShell ajoute du&&
support!&& et || étaient sur la liste des choses à implémenter (sont toujours) mais ne sont pas apparues comme la prochaine chose la plus utile à ajouter. La raison en est que nous avons -AND et -OR. Si vous pensez que c'est important, veuillez déposer une suggestion sur Connect et nous la considérerons pour la V3.
la source
-AND
-and
mange la sortie, pas du tout équivalent.Essaye ça:
$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
la source
$ErrorActionPreference
régit uniquement la manière dont les erreurs non terminales signalées par les applets de commande sont traitées; les utilitaires externes tels quecsc
eta.exe
ne signalent jamais de telles erreurs (ils ne reflètent leur état de sortie que dans$?
(indicateur de réussite) et$LASTEXITCODE
(le code de sortie spécifique signalé)), donc votre ligne de commande équivaut à une exécution inconditionnelle des deux commandes (l'équivalent decmd
'scsc /t:exe /out:a.exe SomeFile.cs & a.exe
)Si votre commande est disponible dans cmd.exe (quelque chose comme
python ./script.py
, mais pas la commande PowerShell commeii .
(cela signifie ouvrir le répertoire actuel par l' Explorateur Windows )), 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 .la source
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)
renvoyé vrai et(Get-Content $MyVar)
également retourné vrai .Deuxième test
PS C:\> $MyVar = $null PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar) False
($MyVar -ne $null)
renvoyé faux et jusqu'à présent, je dois supposer que le résultat est(Get-Content $MyVar)
également faux .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")
n'a jamais été exécutée, en retournant false sur l'ensemble de la commande.la source
Question très ancienne, mais pour les nouveaux venus: peut-être que la version PowerShell (similaire mais non équivalente ) que la question recherche, est à utiliser
-and
comme suit:(build_command) -and (run_tests_command)
la source
&&
, dans la mesure où il ignore le code de sortie debuild_command
.;
est l'équivalent de&
en cmd et;
en bash. Ce n'est certainement pas la même chose que&&
dans cmdUn équivalent verbeux consiste à 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 a fonctionné.la source
Utilisation:
if (start-process filename1.exe) {} else {start-process filename2.exe}
C'est un peu plus long que "&&", mais il accomplit la même chose sans script et n'est pas trop difficile à retenir.
la source
Start-Process
est le mauvais outil à utiliser pour appeler les utilitaires de ligne de commande en général. Plus précisément, tel qu'utilisé ici,Start-Process
s'exécute defilename1.exe
manière asynchrone dans une nouvelle fenêtre de console et ne renvoie rien , ce qui dans un contexte booléen est évalué à$false
. Même si vous omettezStart-Process
(c'est ainsi que vous devez appeler les utilitaires de ligne de commande - directement), l'approche échouera, car le résultat du conditionnel dépend alors de si l'utilitaire a produit une sortie stdout, ce qui n'a aucune relation garantie avec le fait qu'il réussi ou non.Je pense qu'une simple
if
déclaration peut y parvenir. Une fois que j'ai vu la réponse de mkelement0 selon laquelle le dernier statut de sortie est stocké dans $?, J'ai rassemblé les éléments suivants:# Set the first command to a variable $a=somecommand # Temporary variable to store exit status of the last command (since we can't write to "$?") $test=$? # Run the test if ($test=$true) { 2nd-command }
Donc, pour l'exemple du PO, ce serait:
a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }
la source
Installez simplement PowerShell 7 ( allez ici , faites défiler et développez la section des actifs). Cette version a implémenté les opérateurs de chaîne de pipeline.
la source
Cela dépend du contexte, mais voici un exemple de "-and" en action:
get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }
Donc, c'est obtenir tous les fichiers de plus de 10 ko dans un répertoire dont le nom de fichier commence par "f".
la source
Nous pouvons essayer cette commande au lieu d'utiliser la méthode &&:
try {hostname; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}
la source
try
/catch
, car il n'est nécessaire que pour mettre fin aux erreurs, quels utilitaires externes tels quehostname
,ipconfig
etfindstr
ne peuvent pas déclencher. La vérification$LASTEXITCODE
n'est nécessaire que si vous souhaitez connaître le code de sortie spécifique défini par un utilitaire externe - le succès ou l'échec abstrait est reflété$?
, tout comme avec les applets de commande natives.&&
dans Unix, c'est un peu comme try / catch en ce qu'il ne vous oblige pas à envelopper les commandes suivantes dans un nouveau bloc (c'est-à-dire}
) lorsque vous court-circuitez les commandes ultérieures (les sautez). Je pense qu'uneAmpAmp
fonction / filtre qui jette quandif (!?) { throw "last command failed" }
serait un remplacement très utile pour le portage&&
vers PowerShell. utilisation :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe