Posso fazer com que o&& trabalhe no Powershell?


186

&&é notoriamente difícil de pesquisar no google, mas o melhor que encontrei é este artigo que diz usar -and.

Infelizmente, ele não fornece mais informações e não consigo descobrir o que devo fazer -and(novamente, uma coisa notoriamente difícil de procurar)

O contexto em que estou tentando usá-lo é "execute cmd1 e, se for bem-sucedido, execute cmd2", basicamente este:

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

Esse deve ser um ponto fácil para alguns que sabem, obrigado!


Edit: Se você apenas deseja executar vários comandos em uma única linha e não se importa se o primeiro falha ou não, você pode usá-lo. ;Para a maioria dos meus objetivos, tudo bem.

Por exemplo: kill -n myapp; ./myapp.exe.


O PowerShell possui operadores lógicos. Os operadores não estão funcionando da maneira que você espera? Nesse caso, você pode postar a expressão aqui.
Mohit Chakraborty

Veja esta questão, ele faz o que quiser: stackoverflow.com/questions/1917271/...
joshperry

2
Quem estiver interessado no estilo Bash &&e ||se tornar parte do PowerShell: vote no recurso aqui .
precisa saber é o seguinte

1
Com relação à necessidade de realizar pesquisas na web para consultas com símbolos literais (e significativos): SymbolHound é útil para isso. Aqui estão alguns exemplos que dizem respeito à pergunta: PowerShell && ; PowerShell - e . Se você usa o DuckDuckGo , pode pesquisar no SymbolHound via !sym.
Nisavid

3
Atualização de junho de 2019 : a equipe do PowerShell está implementando &&e ||! Pesar no PR
pilau

Respostas:


193

No CMD, '&&' significa "execute o comando 1 e, se for bem-sucedido, execute o comando 2". Eu o usei para coisas como:

build && run_tests

No PowerShell, a coisa mais próxima que você pode fazer é:

(build) -and (run_tests)

Tem a mesma lógica, mas o texto de saída dos comandos é perdido. Talvez seja bom o suficiente para você.

Se você estiver fazendo isso em um script, provavelmente será melhor separar as instruções, assim:

build
if ($?) {
    run_tests
}

27/11 2019 : o &&operador já está disponível para o PowerShell 7 Preview 5+ :

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE: "ridículo que eles removessem" - não gosto de pensar no PowerShell como "CMD com as partes estúpidas removidas". is.gd/k92B
Jay Bazuzi

90
Não gosto de pensar no PowerShell como "CMD com as partes estúpidas removidas". Eu gosto de pensar nisso como "Bash sem nenhum dos bits úteis".
Pod

15
Você também pode fazer build ; if ($?) { run_tests }na linha de comando.
docwhat

19
A maneira mais rápida de frustração real ao aprender o PowerShell é começar pensando que é apenas um CMD expandido ou uma festa. Ele tem um modelo fundamentalmente diferente, especialmente quando se trata de entrada, saída, tubulação e resultados. Comece com um bom tutorial ou visão geral e não tente fazer com que a sintaxe de outros shells funcione. Você tem que tomar em seus próprios termos.
Mark Meuer

3
Tomando o PowerShell em seus próprios termos, como executo um comando e, somente se esse comando for bem-sucedido, execute outro comando? Eu não acho que isso imponha bashidéias no PowerShell. É a funcionalidade básica do shell. Até agora, o melhor que vi é o build ; if ($?) { run_tests }que vou usar a partir de agora. Espero que a equipe do PowerShell adicione &&suporte!
Nate

28

&& e || estavam na lista de itens a serem implementados (ainda estão), mas não apareceram como a próxima coisa mais útil a ser adicionada. O motivo é que temos -AND e -OR. Se você acha que é importante, envie uma sugestão no Connect e a consideraremos para a V3.


11
Eu me inscrevi no Connect e me nomeei para o PowerShell, mas não consigo descobrir como fazer uma sugestão. O site do Connect é realmente complexo e confuso :-(
Orion Edwards

6
Eu não poderia encontrar uma solicitação pré-existente, então eu fiz um: connect.microsoft.com/PowerShell/feedback/details/778798/...
Andy Arismendi

22
Você sabe, a questão ainda é como escrever um equivalente, e sua resposta seria muito mais útil se você adicionou um exemplo de utilização -AND
Kyeotic

5
É importante porque é uma ferramenta básica de controle de fluxo usada em sistemas mais antigos que o Windows por quase eternidade. Assim está presente ainda outra diferença entre o linux e o windows.
Airtonix

6
Espero que Jeffrey Snover esteja ouvindo, esse SO deve ser motivo suficiente para implementá-lo agora. Faz muito tempo e agora o PowerShell começa a aparecer em alguns lugares, como o VSCode o usa como um terminal padrão no Windows. É uma dor total sem &&, -ando resultado é o resultado, não equivalente.
Ciantic # 14/17

13

Tente o seguinte:

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

9
Nota: Se o primeiro comando falhar, o segundo ainda será executado.
BrunoLM 25/05

4
A variável de preferência $ErrorActionPreferencecontrola apenas como os erros não terminados relatados pelos cmdlets são tratados; utilitários externos como csce a.exenunca relatam esses erros (eles refletem apenas o status de saída em $?(sinalizador de sucesso) e $LASTEXITCODE(o código de saída específico relatado)); portanto, sua linha de comando equivale à execução incondicional de ambos os comandos (o equivalente a cmd's csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mklement0

5

Se seu comando estiver disponível no cmd.exe (algo como, python ./script.pymas não no PowerShell, como ii .(Isso significa abrir o diretório atual pelo explorer)), você poderá executar o cmd.exe no PowerShell. A sintaxe é assim:

cmd /c "command1 && command2"

Aqui, &&é fornecido pela sintaxe cmd descrita nesta pergunta .


4
Bom, atualize para o cmd para acessar sua funcionalidade adicional.
Bill K

4

Eu tentei esta sequência de comandos no PowerShell:

Teste de Fisrt

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

($MyVar -ne $null)retornou verdadeiro e (Get-Content $MyVar)também retornou verdadeiro .

Segundo teste

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

($MyVar -ne $null)retornou false e até agora devo assumir que (Get-Content $MyVar)também retornou false .

O terceiro teste comprovou que a segunda condição nem sequer foi analisada.

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

($MyVar -ne $null)retornou false e provou que a segunda condição (Get-Content "C:\MyTxt.txt")nunca foi executada, retornando false em todo o comando.


Você está certo! isso se comporta como o operador &&. Mesmo um $ () no lado direito não permitirá avaliar isso!
Falco Alexander

2

Pergunta muito antiga, mas para os novatos: talvez a versão do PowerShell (semelhante, mas não equivalente ) que a pergunta está procurando, seja a -andseguinte:

(build_command) -and (run_tests_command)


1
Isso pode ser bom para o seu caso de uso, mas não está se comportando assim &&, pois ignora o código de saída de build_command.
22619 Simon Buchan

Definitivamente, isso não está fazendo a coisa correta. Ele executará o segundo comando, mesmo que o primeiro falhe.
Nate

isso está completamente errado. ;é o equivalente &em cmd e ;em bash. Definitivamente não é o mesmo que &&no cmd
phuclv

Também silencia STDOUT e STDERR para ambos os processos.
Dragas 24/06

0

Depende do contexto, mas aqui está um exemplo de "-e" em ação:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

Portanto, está obtendo todos os arquivos maiores que 10kb em um diretório cujo nome de arquivo começa com "f".


1
Esta não é uma resposta para a pergunta original, que consiste em executar vários comandos.
bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

É um pouco mais longo que "&&", mas realiza a mesma coisa sem scripts e não é muito difícil de lembrar. Antes tarde do que nunca. :)


2
Start-Processé a ferramenta errada a ser usada para chamar utilitários de linha de comando em geral. Especificamente, conforme usado aqui, Start-Processé executado de filename1.exeforma assíncrona em uma nova janela do console e não retorna nada , que é avaliado em um contexto booleano $false. Mesmo que você o tenha omitido Start-Process(e é assim que você deve chamar os utilitários de linha de comando - diretamente), a abordagem será insuficiente, porque o resultado da condicional depende se o utilitário produziu alguma saída stdout, que não tem relação garantida conseguiu ou não.
precisa saber é o seguinte

0

Eu acho que uma declaração simples se pode conseguir isso. Depois que vi a resposta de mkelement0 acima desse último status de saída é armazenada em $?, Juntei o seguinte:

# 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 }

Portanto, para o exemplo do op, seria:

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

0

Um equivalente detalhado é combinar $LASTEXITCODEe -eq 0:

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

Não sei por if ($?)que não funcionou para mim, mas este funcionou.


-1

Podemos tentar este comando em vez de usar o método &&

tente {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} pegue {echo err} finalmente {}


Não há necessidade de try/ catch, porque é necessário apenas para encerrar erros, que utilitários externos, como hostname, ipconfige findstrnão podem disparar. A verificação $LASTEXITCODEé necessária apenas se você quiser conhecer o código de saída específico definido por um utilitário externo - o sucesso ou falha abstrata é refletida $?, assim como nos cmdlets nativos.
usar o seguinte comando

Acho que a @Cyberiron está no caminho certo. Eu acho que &&no Unix é muito parecido com try / catch, pois não exige que você agrupe comandos subsequentes em um novo bloco (ou seja }) quando você executa um curto-circuito nos comandos posteriores (ignore-os). Eu acho que uma AmpAmpfunção / filtro que lança quando if (!?) { throw "last command failed" }seria um substituto muito útil para portar &&para o PowerShell. uso :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg 20/12/18
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.