Can I get && to work in Powershell?

&& is notoriously hard to search for on google, but the best I've found is this article which says to use -and.

Unfortunately it doesn't give any more information, and I can't find out what I'm supposed to do with -and (again, a notoriously hard thing to search for)

The context I'm trying to use it in is "execute cmd1, and if successful, execute cmd2", basically this:

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

This should be an easy few rep points to someone who knows, thanks!


Edit: If you just want to run multiple commands on a single line and you don't care if the first one fails or not, you can use ; For most of my purposes this is fine

For example: kill -n myapp; ./myapp.exe.

Answers


In CMD, '&&' means "execute command 1, and if it succeeds, execute command 2". I have used it for things like:

build && run_tests

In PowerShell, the closest thing you can do is:

(build) -and (run_tests)

It has the same logic, but the output text from the commands is lost. Maybe it is good enough for you, though.

EDIT

If you're doing this in a script, you will probably be better off separating the statements, like this:

build
if ($?) {
    run_tests
}

&& and || were on the list of things to implement (still are) but did not pop up as the next most useful thing to add. The reason is that we have -AND and -OR. If you think it is important, please file a suggestion on Connect and we'll consider it for V3.


Try this:

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

If your command is available in cmd.exe (something like python ./script.py but not PowerShell command like ii . (This means to open the current directory by explorer)), you can run cmd.exe within PowerShell. The syntax is like this:

cmd /c "command1 && command2"

Here, && is provided by cmd syntax described in this question.


I tried this sequence of commands in PowerShell:

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

($MyVar -ne $null) returned true and (Get-Content $MyVar) also returned true.

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

($MyVar -ne $null) returned false and so far I must assume the (Get-Content $MyVar) also returned false.

Third test proved the second condition was not even analyzed.
PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null) returned false and proved the second condition (Get-Content "C:\MyTxt.txt") never ran, by returning false on the whole command.


I think a simple if statement can accomplish this. Once I saw mkelement0's response above that last exit status is stored in $?, I put the following together:

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

So for the op's example, it would be:

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

Typically, on Linux I'd do something like: ruby -c learn.rb && foodcritic learn.rb

However, on Windows PS, can't do it! So I ended up just making a .ps1 file with this:

Param(
  [string]$fileName
)

ruby -c $fileName
foodcritic $fileName

and called it 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>

A verbose equivalent is to combine $LASTEXITCODE and -eq 0:

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

I'm not sure why if ($?) didn't work for me, but this one did.


It depends on the context, but here's an example of "-and" in action:

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

So that's getting all the files bigger than 10kb in a directory whose filename starts with "f".


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

It's a little longer than "&&" but accomplishes the same thing without scripting and is not too hard to remember. Better late than never. :)


We can try this command instead of using && method

try {hostname; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}


Need Your Help

How to leverage PHP's autoloader functionality in such a way, that it searches through a defined set of paths?

php autoload

One bad thing about using the autoloader is, that it doesn't know where to look at. My framework already has about 70 classes in about 15 different directories. Because of that, I didn't go for aut...

Are there any differences between Java's "synchronized" and C#'s "lock"?

c# java synchronization

Do these two keywords have exactly the same effect, or is there something I should be aware of?