Bagaimana cara memulai program dengan argumen baris perintah pada Windows 'cmd dengan perintah' mulai '?

33

Saya perlu memulai program (mesin virtual) di latar belakang dengan startperintah pada baris perintah 7 Windows. Biasanya Anda akan melakukan ini seperti itu:

start /b cmd yourprogram

Tapi saya perlu menyampaikan beberapa argumen dan ketika saya suka seperti ini (tanpa /bbendera untuk melihat informasi debug):

start C:\Users\USER>start "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"

Saya mendapatkan pesan kesalahan ini:

Windows tidak dapat menemukan '-startvm'. Pastikan Anda mengetik nama dengan benar, lalu coba lagi.

Di sisi lain ketika saya melakukannya di jendela baris perintah saat ini tanpa startdi awal mesin virtual berjalan secara normal - tetapi di latar depan.

Ada solusi?

Patryk
sumber

Jawaban:

36
start /b "" "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"

Jika Anda membaca daftar parameter dengan start /?:

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     Title to display in window title bar.
    command/program
                If it is an internal cmd command or a batch file then
                the command processor is run with the /K switch to cmd.exe.
                This means that the window will remain after the command
                has been run.

                If it is not an internal cmd command or batch file then
                it is a program and will run as either a windowed application
                or a console application.

    parameters  These are the parameters passed to the command/program.

Diharapkan titleterlampir dalam tanda kutip ( "). Karena jalur program Anda menyertakan tanda kutip, ia ditafsirkan sebagai judul. Menambahkan judul eksplisit (dalam hal ini, kosong, "") berfungsi.


Metode alternatif menggunakan /dsakelar untuk menentukan jalur. Secara khusus:

start /b /d "c:\Program Files\Oracle\VirtualBox\" VBoxHeadless.exe -startvm "debian604 64"

Tampaknya mengambil argumen pertama setelah /dberalih sebagai path, bahkan jika itu dikutip, dan jika argumen berikutnya tidak dikutip maka ini berfungsi. Semuanya setelah apa yang dikenali sebagai perintah / program dilewatkan sebagai parameter untuk perintah / program itu. Catatan ini tidak akan berfungsi jika perintah / program memiliki spasi dalam nama, misalnya VBox Headless.exe, karena itu akan memerlukan tanda kutip dan dikenali sebagai judul.


Secara keseluruhan, metode pertama (judul eksplisit) mungkin lebih baik. Itu adalah pilihan desain yang buruk di pihak Microsoft, mereka seharusnya menambahkan pergantian judul alih-alih "apakah argumen pertama terlampir dalam tanda kutip?".

Bob
sumber
Terima kasih banyak untuk itu :) Meskipun seperti yang saya tahu start /btidak menempatkan mesin virtual di latar belakang. Saya harus datang dengan sesuatu yang lain.
Patryk
Jika Anda hanya ingin menekan output ( stdout), tambahkan a >nulsampai akhir. Gunakan >nul 2>nuldi akhir untuk menekan output normal dan output error ( stderr). Jendela command prompt harus tetap terbuka.
Bob
1
@Patryk Jika Anda tidak keberatan menggunakan PowerShell, perintah ini akan membuka proses tanpa jendela yang tidak terhubung ke proses pemijahan (powershell.exe). Oleh karena itu jendela PowerShell dapat ditutup dan VBoxHeadless akan terus berjalan. PowerShell hadir dengan Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Bob
3

Sebenarnya jawaban yang diterima masih bukan solusi. Menutup jendela cmd tempat perintah dieksekusi akan mematikan proses vboxheadless dengan mesin virtual yang berjalan di dalamnya.

Menggunakan pendekatan di bawah ini akan membuat PowerShell menjalankan proses independen.

Dalam cmd, jalankan:

cd "c:\Program Files\Oracle\VirtualBox"
vboxmanage list vms

Ini akan mengembalikan sesuatu seperti:

"Webserver LAP" {8748b594-7e2d-4d8d-8785-999940766754}

Sekarang ambil UUID dan jalankan yang berikut (masih dalam cmd):

powershell start-process 'C:\program files\oracle\virtualbox\vboxheadless' '-s 8748b594-7e2d-4d8d-8785-999940766754' -WindowStyle Hidden

Terima kasih kepada penulis artikel ini .

Charlie Vieillard
sumber
Dalam komentar saya pada jawaban saya sendiri, saya sudah menyediakan metode alternatif untuk "menjalankan VBox tanpa kepala". Jawaban saya sendiri membahas pertanyaan "meneruskan argumen dengan start".
Bob
WOW! cdSIMPAN JAM SAYA!
T.Todua