Bagaimana cara menjalankan dua perintah dalam satu baris di Windows CMD?

962

Saya ingin menjalankan dua perintah di konsol Windows CMD.

Di Linux saya akan melakukannya seperti ini

touch thisfile ; ls -lstrh

Bagaimana ini dilakukan pada Windows?

flybywire
sumber

Jawaban:

1322

Seperti ini di semua OS Microsoft sejak tahun 2000, dan masih bagus hingga hari ini:

dir & echo foo

Jika Anda ingin perintah kedua dijalankan hanya jika yang pertama berhasil:

dir && echo foo

Sintaks ampersand tunggal (&) untuk menjalankan beberapa perintah pada satu baris kembali ke Windows XP, Windows 2000, dan beberapa versi NT sebelumnya. (Setidaknya 4.0, menurut salah satu komentator di sini.)

Ada beberapa poin lain tentang ini yang akan Anda temukan di halaman ini.

Data historis berikut, untuk mereka yang mungkin menganggapnya edukatif.

Sebelum itu, sintaks && hanya fitur dari penggantian shell 4DOS sebelum fitur itu ditambahkan ke juru bahasa perintah Microsoft.

Di Windows 95, 98 dan ME, Anda akan menggunakan karakter pipa sebagai gantinya:

dir | echo foo

Dalam MS-DOS 5.0 dan yang lebih baru, melalui beberapa versi sebelumnya dari Windows dan NT dari interpreter perintah, pemisah perintah (tidak berdokumen) adalah karakter 20 (Ctrl + T) yang saya akan wakili dengan ^ T di sini.

dir ^T echo foo
djdanlib
sumber
26
Paling tidak ke NT 4.
Joey
17
Bekerja pada Win 8.0 dan 8.1 juga.
MEMark
5
@Fallenreaper, itu bekerja dengan cmdcepat juga, jadi saya kira itu bukan kebiasaan buruk untuk masuk. :)
6
@Fallenreaper Pastikan Anda mengetahui perbedaan praktis antara keduanya: Lihat jawaban Raihan di bawah ini.
Moshe Katz
8
Mengerti A && B, B hanya akan berjalan jika A berhasil, sedangkan A & B akan berjalan B setelah A, tidak peduli apa pun hasilnya. Terima kasih atas perhatiannya
Fallenreaper
580

Kutipan dari dokumentasi:

Menggunakan banyak perintah dan simbol pemrosesan bersyarat

Anda dapat menjalankan banyak perintah dari satu baris perintah atau skrip menggunakan simbol pemrosesan bersyarat. Saat Anda menjalankan banyak perintah dengan simbol pemrosesan bersyarat, perintah di sebelah kanan simbol pemrosesan bersyarat bertindak berdasarkan hasil perintah di sebelah kiri simbol pemrosesan bersyarat.

Misalnya, Anda mungkin ingin menjalankan perintah hanya jika perintah sebelumnya gagal. Atau, Anda mungkin ingin menjalankan perintah hanya jika perintah sebelumnya berhasil.

Anda dapat menggunakan karakter khusus yang tercantum dalam tabel berikut untuk memberikan beberapa perintah.

  • & [...]
    command1 & command2
    Gunakan untuk memisahkan beberapa perintah pada satu baris perintah. Cmd.exe menjalankan perintah pertama, dan kemudian perintah kedua.

  • && [...]
    command1 && command2
    Gunakan untuk menjalankan perintah mengikuti && hanya jika perintah sebelum simbol berhasil. Cmd.exe menjalankan perintah pertama, dan kemudian menjalankan perintah kedua hanya jika perintah pertama selesai dengan sukses.

  • || [...]
    command1 || command2
    Gunakan untuk menjalankan perintah berikut || hanya jika perintah sebelumnya | | gagal Cmd.exe menjalankan perintah pertama, dan kemudian menjalankan perintah kedua hanya jika perintah pertama tidak berhasil diselesaikan (menerima kode kesalahan lebih besar dari nol).

  • ( ) [...]
    (command1 & command2)
    Gunakan untuk mengelompokkan atau membuat banyak perintah.

  • ; or ,
    command1 parameter1;parameter2
    Gunakan untuk memisahkan parameter perintah.

Raihan
sumber
41
Coba cmd /c "echo foo & echo bar".
Raihan
2
vagrant up && vagrant sshbekerja tanpa tanda kutip pada Windows 10.
furman87
Terima kasih! Saya tidak tahu tentang menghanguskan &- membuatnya asinkron dan menjalankan keduanya secara paralel. Saya macet karena saya menggunakan &&dengan sinkron dan hanya berlanjut jika yang pertama berhasil!
TetraDev
1
Link dokumentasi rusak, lokasi baru technet.microsoft.com/en-us/library/bb490954.aspx
nkef
7
@TetraDev &tidak membuat perintah asinkron atau paralel. command1 & command2akan berjalan command2 setelah command1 selesai. Keberhasilan atau kegagalan command1tidak relevan.
bornfromanegg
74

&adalah setara Bash untuk ;(menjalankan perintah) dan &&setara dengan Bash &&(menjalankan perintah hanya ketika sebelumnya tidak menyebabkan kesalahan).

manojlds
sumber
1
ini juga berlaku untuk csh, tcsh dan banyak lagi kerang. Saya belum pernah melihat ;sebelumnya di Linux
phuclv
10
@ LưuVĩnhPhúc dalam sh-style shells, ;artinya menjalankan perintah pertama, menunggu sampai selesai, lalu jalankan perintah kedua. &artinya menjalankan perintah pertama, meletakkannya di latar belakang, dan menjalankan perintah kedua. Jadi kedua program diluncurkan secara bersamaan. Perhatikan bahwa ini tidak menggabungkan simbol, mereka mengikuti simbol ke perintah pertama; Anda dapat meluncurkan satu perintah di latar belakang progname &tanpa memiliki perintah kedua.
MM
25

Anda dapat menggunakan & untuk menjalankan perintah satu demi satu. Contoh:c:\dir & vim myFile.txt

scrappedcola
sumber
19

Jika Anda ingin membuat pintasan cmd (misalnya pada desktop Anda) tambahkan / k parameter (/ k berarti keep, / c akan menutup jendela):

cmd /k echo hello && cd c:\ && cd Windows
TroodoN-Mike
sumber
16

Anda dapat menggunakan panggilan untuk mengatasi masalah variabel lingkungan yang dievaluasi terlalu cepat - misalnya

set A=Hello & call echo %A%
SSi
sumber
1
Ini hanya berfungsi jika variabel belum ditetapkan, dalam hal ini echomencetak nilai lama , bukan nilai baru. Setidaknya, ini yang saya amati pada kotak Windows 7 saya.
Craig M. Brandenburg
Saya menggunakan set A = pertama untuk memastikan variabel tidak disetel.
SSi
1
Metode yang lebih baik adalah dengan menggunakan ekspansi yang tertunda ( setlocal EnableDelayedExpansiondalam skrip atau cmd /v). Sebagai contoh: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
5
Gunakan ^ setelah persen pertama untuk mendapatkan nilai baru: atur A = Halo & panggil gema% ^ A%
Nicolas
9

Sejumlah simbol pemrosesan dapat digunakan ketika menjalankan beberapa perintah pada baris yang sama, dan dapat menyebabkan pemrosesan pengalihan dalam beberapa kasus, mengubah output dalam kasus lain, atau hanya gagal. Satu kasus penting adalah menempatkan pada perintah baris yang sama yang memanipulasi variabel.

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

Seperti yang Anda lihat dalam contoh di atas, ketika perintah menggunakan variabel ditempatkan pada baris yang sama, Anda harus menggunakan ekspansi yang tertunda untuk memperbarui nilai variabel Anda. Jika variabel Anda diindeks, gunakan perintah CALL dengan pengubah %% untuk memperbarui nilainya di baris yang sama:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
sambul35
sumber
contoh yang diberikan tidak bekerja untuk saya tetapi di bawah satu yang:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw
8

cmd /c ipconfig /all & Output.txt

Perintah ini menjalankan perintah dan membuka Output.txtfile dalam satu perintah

dpp.2325
sumber
8

Jadi, saya mencoba mengaktifkan tugas khusus untuk menjalankan RegAsm(register assembly) dari menu konteks. Masalah yang saya miliki adalah bahwa hasilnya akan menyala dan pergi sebelum saya bisa membacanya. Jadi saya mencoba piping Pause, yang tidak berfungsi ketika perintah gagal (seperti yang disebutkan di sini perintah Jeda tidak bekerja dalam skrip .bat dan di sini perintah file Batch PAUSE tidak berfungsi ). Jadi saya mencoba cmd /ktetapi membiarkan jendela terbuka untuk lebih banyak perintah (saya hanya ingin membaca hasilnya). Jadi saya menambahkan pausediikuti oleh exitke rantai, menghasilkan yang berikut:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

Ini berfungsi seperti jimat - RegAsm berjalan pada file dan menunjukkan hasilnya, lalu muncul prompt "Tekan sembarang tombol untuk melanjutkan ...", kemudian jendela prompt perintah ditutup saat tombol ditekan.

PS Untuk orang lain yang mungkin tertarik, Anda dapat menggunakan entri file .reg berikut untuk menambahkan asosiasi dllfile ke file .dll dan kemudian ekstensi perintah RegAsm untuk itu (perhatikan tanda kutip dan garis miring terbalik yang hilang):

[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"

Sekarang saya memiliki menu klik kanan yang bagus untuk mendaftarkan majelis.

SNAFUBAR
sumber
4

Untuk menjalankan dua perintah secara bersamaan, Anda harus meletakkan simbol & (ampersand) di antara kedua perintah tersebut. Seperti itu:

color 0a & start chrome.exe

Bersulang!

PryroTech
sumber
4

Saya mencoba memiliki dua ping di jendela yang sama, dan itu adalah perintah serial pada baris yang sama. Setelah menyelesaikan yang pertama, jalankan perintah kedua.

Solusinya adalah menggabungkan dengan start /bpada prompt perintah Windows 7.

Mulai seperti biasa, tanpa /b, dan luncurkan di jendela terpisah.

Perintah yang digunakan untuk memulai di baris yang sama adalah:

start /b command1 parameters & command2 parameters

Bagaimanapun, jika Anda ingin mem-parsing output, saya tidak merekomendasikan untuk menggunakan ini. Saya perhatikan output diacak antara output dari perintah.

sdcxp
sumber
4

Nah, Anda memiliki dua opsi: Perpipaan, atau hanya &:

DIR /S & START FILE.TXT

Atau,

tasklist | find "notepad.exe"

Piping ( |) lebih untuk mengambil output dari satu perintah, dan memasukkannya ke perintah lain. Dan ( &) hanya mengatakan jalankan ini, dan itu.

PyDever
sumber
Bisakah Anda mengedit posting Anda untuk memasukkan beberapa penjelasan apa yang dilakukan &dan |dilakukan dan bagaimana mereka berbeda, jika sama sekali? Saat ini orang-orang yang tidak terbiasa dengan konsep-konsep ini tidak dapat memutuskan sendiri mana yang harus digunakan dalam kasus mereka.
Mirek Długosz
Seperti saya. Salahku. Saya akan segera mengedit posting. Menghargai itu.
PyDever
Seharusnya "findstr" bukan hanya "find"
Anu Shibin Joseph Raj
2

Tidak, cd / && tree && echo %time%. Waktu yang digaungkan adalah saat perintah pertama dijalankan.

Perpipaan memiliki beberapa masalah, tetapi itu tidak penting selama orang tahu cara kerjanya.

notarealname
sumber
1

Satu lagi contoh: Misalnya, ketika kita menggunakan gulpsistem build, bukan

gulp - default> build

gulp build - build build-folder

gulp watch - mulai file-watch

gulp dist - bangun dist-folder

Kita dapat melakukannya dengan satu baris:

cd c:\xampp\htdocs\project & gulp & gulp watch
Mile Mijatović
sumber
1

Ketika Anda mencoba menggunakan atau memanipulasi variabel dalam satu baris, waspadalah terhadap konten mereka! Misalnya variabel seperti berikut

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

dapat menyebabkan banyak masalah yang tidak dapat ditangani jika Anda menggunakannya %PATH%

  1. Tanda kurung penutup mengakhiri pernyataan grup Anda
  2. Kutipan ganda tidak memungkinkan Anda untuk menggunakan %PATH%untuk menangani masalah kurung
  3. Dan apa yang akan %USERPROFILE%berisi variabel referensi seperti ?
V15I0N
sumber
2
Apa hubungannya dengan menjalankan dua perintah dalam satu baris di Windows CMD?
Peter Mortensen
1

Gunakan &simbol di windows untuk menggunakan perintah dalam satu baris

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

seperti di linux yang kita gunakan,

touch thisfile ; ls -lstrh
Arshdeep Kharbanda
sumber
0

Ya ada. Ini &.

&& akan menjalankan perintah 2 ketika perintah 1 selesai asalkan tidak gagal.

& akan mengeksekusi terlepas.

هادی کشاورز Hadi Keshavarz
sumber
-2

Sederhana: cukup bedakan dengan &&tanda. Contoh:

echo "Hello World" && echo "GoodBye World".

"Selamat tinggal Dunia" akan dicetak setelah "Hello World".

Rajan Dhanowa
sumber
6
Terlepas dari kenyataan, bahwa sudah ada jawaban lama yang menunjukkan hal yang sama, itu masih belum sepenuhnya benar. &&adalah operator kondisional , perintah berikutnya hanya dijalankan ketika perintah pertama berhasil (errorlevel = 0)
jeb
tentu saja. itu jelas jika orang ingin menjalankan dua perintah keduanya akan benar dan dengan demikian semuanya akan berjalan baik
Rajan Dhanowa
1
Rajan: maksudnya "perintah berikutnya hanya dijalankan jika perintah pertama berhasil".
Ivan
2
" Selamat tinggal Dunia akan dicetak setelah Hello World " asalkan pencetakan Hello Worldtidak gagal. seperti @jeb katakan, &&adalah bersyarat. &menjalankan perintah terlepas dari apakah sebelumnya berhasil atau tidak.
Pranav A.