I want to run two commands in a Windows CMD console.
In Linux I would do it like this
touch thisfile ; ls -lstrh
How is it done on Windows?
Like this on all Microsoft OSes since 2000, and still good today:
dir & echo foo
If you want the second command to execute only if the first exited successfully:
dir && echo foo
The single ampersand (&) syntax to execute multiple commands on one line goes back to Windows XP, Windows 2000, and some earlier NT versions. (4.0 at least, according to one commenter here.)
There are quite a few other points about this that you'll find scrolling down this page.
Historical data follows, for those who may find it educational.
Prior to that, the && syntax was only a feature of the shell replacement 4DOS before that feature was added to the Microsoft command interpreter.
In Windows 95, 98 and ME, you'd use the pipe character instead:
dir | echo foo
In MS-DOS 5.0 and later, through some earlier Windows and NT versions of the command interpreter, the (undocumented) command separator was character 20 (Ctrl+T) which I'll represent with ^T here.
dir ^T echo foo
A quote from the documentation:
Source: Microsoft, Windows XP Professional Product Documentation, Command shell overview
Also: An A-Z Index of Windows CMD commands
Using multiple commands and conditional processing symbols You can run multiple commands from a single command line or script using conditional processing symbols. When you run multiple commands with conditional processing symbols, the commands to the right of the conditional processing symbol act based upon the results of the command to the left of the conditional processing symbol. For example, you might want to run a command only if the previous command fails. Or, you might want to run a command only if the previous command is successful. You can use the special characters listed in the following table to pass multiple commands. & [...] command1 & command2 Use to separate multiple commands on one command line. Cmd.exe runs the first command, and then the second command. && [...] command1 && command2 Use to run the command following && only if the command preceding the symbol is successful. Cmd.exe runs the first command, and then runs the second command only if the first command completed successfully. || [...] command1 || command2 Use to run the command following || only if the command preceding || fails. Cmd.exe runs the first command, and then runs the second command only if the first command did not complete successfully (receives an error code greater than zero). ( ) [...] (command1 & command2) Use to group or nest multiple commands. ; or , command1 parameter1;parameter2 Use to separate command parameters.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
worked without quotation marks on Windows 10.
&
does not make the commands asynchronous or parallel. command1 & command2
will run command2
after command1
has completed. The success or failure of command1
is irrelevant.
&
with if statements can be a little tricky. To run a command after an if statement which does not have an else statement, use (if condition command1) & command2
. Do not try to use if condition (command1) & command2
because command2 will not run.
&
is the Bash equivalent for ;
( run commands) and &&
is the Bash equivalent of &&
(run commands only when the previous has not caused an error).
;
before in Linux
;
means to run the first command, wait for it to finish, then run the second command. &
means to run the first command, put it to background, and run the second command. So both programs launch simultaneously. Note that these aren't combining symbols, they are trailing symbols to the first command; you can launch a single command in background with progname &
without having a second command.
You can use & to run commands one after another. Example: c:\dir & vim myFile.txt
If you want to create a cmd shortcut (for example on your desktop) add /k parameter (/k means keep, /c will close window):
cmd /k echo hello && cd c:\ && cd Windows
You can use call to overcome the problem of environment variables being evaluated too soon - e.g.
set A=Hello & call echo %A%
echo
prints out the old value, not the new value. At least, this is what I observe on my Windows 7 box.
setlocal EnableDelayedExpansion
in a script or cmd /v
). For example: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
set var=Hello & cmd /v /c echo firstUsage=!var! ^& echo secondUsage=!var!
. With Nicolas's solution I should repeat call before every subcommand: set var=Hello & call echo firstUsage=%^var% & call echo secondUsage=%^var%
(probably one knows how to improve this).
A number of processing symbols can be used when running several commands on the same line, and may lead to processing redirection in some cases, altering output in other case, or just fail. One important case is placing on the same line commands that manipulate variables.
@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!
0 1
As you see in the above example, when commands using variables are placed on the same line, you must use delayed expansion to update your variable values. If your variable is indexed, use CALL command with %% modifiers to update its value on the same line:
set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%
path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
cmd /c ipconfig /all & Output.txt
This command execute command and open Output.txt
file in a single command
So, I was trying to enable the specific task of running RegAsm
(register assembly) from a context menu. The issue I had was that the result would flash up and go away before I could read it. So I tried piping to Pause
, which does not work when the command fails (as mentioned here Pause command not working in .bat script and here Batch file command PAUSE does not work). So I tried cmd /k
but that leaves the window open for more commands (I just want to read the result). So I added a pause
followed by exit
to the chain, resulting in the following:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
This works like a charm -- RegAsm runs on the file and shows its results, then a "Press any key to continue..." prompt is shown, then the command prompt window closes when a key is pressed.
P.S. For others who might be interested, you can use the following .reg file entries to add a dllfile association to .dll files and then a RegAsm command extension to that (notice the escaped quotes and backslashes):
[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"
Now I have a nice right-click menu to register an assembly.
Well, you have two options: Piping, or just &
:
DIR /S & START FILE.TXT
Or,
tasklist | find "notepad.exe"
Piping (|
) is more for taking the output of one command, and putting it into another. And (&
) is just saying run this, and that.
&
and |
do and how they differ, if at all? Right now people unfamiliar with these concepts are unable to decide for themselves which one should be used in their cases.
In order to execute two commands at the same time, you must put an & (ampersand) symbol between the two commands. Like so:
color 0a & start chrome.exe
Cheers!
I try to have two pings in the same window, and it is a serial command on the same line. After finishing the first, run the second command.
The solution was to combine with start /b
on a Windows 7 command prompt.
Start as usual, without /b
, and launch in a separate window.
The command used to launch in the same line is:
start /b command1 parameters & command2 parameters
Any way, if you wish to parse the output, I don't recommend to use this. I noticed the output is scrambled between the output of the commands.
Use &
symbol in windows to use command in one line
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
like in linux we use,
touch thisfile ; ls -lstrh
No, cd / && tree && echo %time%
. The time echoed is at when the first command is executed.
The piping has some issue, but it is not critical as long as people know how it works.
One more example: For example, when we use the gulp
build system, instead of
gulp
- default > build
gulp build
- build build-folder
gulp watch
- start file-watch
gulp dist
- build dist-folder
We can do that with one line:
cd c:\xampp\htdocs\project & gulp & gulp watch
With windows 10 you can also use scriptrunner:
ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror
it allows you to start few commands on one line you want you can run them consecutive or without waiting each other, you can put timeouts and rollback on error.
In windows, I used all the above solutions &, &&
but nothing worked Finally ';'
symbol worked for me
npm install; npm start
Yes there is. It's &
.
&&
will execute command 2 when command 1 is complete providing it didn't fail.
&
will execute regardless.
Try to create a .bat ot .cmd file with those lines using doskey
key and $T
which is equivalent to &
to do several command line in just one line :
touch=echo off $T echo. ^> $* $T dir /B $T echo on
It'll create an empty file.
Example:
touch myfile
In cmd you'll get something like this:
https://i.stack.imgur.com/mM2dS.png
But as mentioned previously by others, it is really advised to use &
operator to do many command line in one line from CMD prompt.
Enjoy =)
When you try to use or manipulate variables in one line beware of their content! E.g. a variable like the following
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
may lead to a lot of unhand-able trouble if you use it as %PATH%
The closing parentheses terminate your group statement The double quotes don't allow you to use %PATH% to handle the parentheses problem And what will a referenced variable like %USERPROFILE% contain?
It's simple: just differentiate them with &&
signs. Example:
echo "Hello World" && echo "GoodBye World".
"Goodbye World" will be printed after "Hello World".
&&
is a conditional operator, the next command is only executed when the first command succeded (errorlevel=0)
Hello World
did not fail. as @jeb has said, &&
is conditional. &
runs commands regardless if the previous was successful or not.
Use &&
between commands.
For example: cls && echo 'hello' && dir c:
&&
does not always execute the next command, only when the first command executes successfully
Success story sharing
cmd
prompt as well, so I suppose it's not a bad habit to get into. :)echo %myvar%
will be run asecho OldValueOfMyVar
. This problem can be resolved by using the Delayed Expansion feature (only available in batch files though). So try the following inside a batch file:setlocal EnableDelayedExpansion && set MyVar=MyVal && echo !MyVar! && endlocal
. (NOTE: The feature requires you to use!
marks in place of the%
symbols.