可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
&&
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
.
回答1:
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
}
回答2:
&& 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.
回答3:
Try this:
$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
回答4:
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.
回答5:
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.
回答6:
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 }
回答7:
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>
回答8:
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.
回答9:
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".
回答10:
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. :)
回答11:
We can try this command instead of using && method
try {hostname; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}