Mengapa menggunakan "Cmd / c Powershell" bukan hanya "Powershell"?

25

Saya telah menambahkan menu konteks pertama saya menggunakan registri sesuai instruksi yang diberikan dalam pertanyaan ini (yay saya).

Saya awalnya menggunakan ini sebagai perintah yang dijalankan, yaitu nilai kunci "perintah":

Cmd /C Powershell  "imageSeqView --% \"%1\""

ImageSeqViewadalah nama fungsi PowerShell saya, saya mengimpornya di profil PowerShell saya. Ini berfungsi dengan baik, tapi saya bertanya-tanya: mengapa digunakan cmduntuk membuka Powershelluntuk menjalankan fungsi? Bukankah lebih sederhana untuk melakukannya

Powershell  "imageSeqView --% \"%1\""

Perintah itu tampaknya bekerja dengan baik, tetapi karena tampaknya kanonik untuk digunakan, cmdsaya bertanya-tanya apakah itu membunuh anak anjing secara diam-diam atau apalah?

masukkan deskripsi gambar di sini

stib
sumber
2
Tidak ada jawaban dalam penggunaan pertanyaan terkait cmd /c... cmd /kagak berbeda karena membiarkan jendela terbuka setelah perintah selesai. Agaknya penanya melakukannya seperti itu sehingga mereka bisa melihat output untuk keperluan debugging.
Bob
1
Ini bukan pengubah yang saya bertanya-tanya tentang, ini penggunaan cmdsama sekali, yang tampaknya ada di mana-mana dari penelitian saya.
stib
Bisakah Anda memberikan referensi yang benar-benar merekomendasikan cmd /c powershellsecara khusus? Sekali lagi, yang Anda tautkan tidak membuat rekomendasi seperti itu.
Bob
3
Pada tebakan, itu mungkin sebagian besar pemuatan kargo. Ada beberapa kasus di mana ini mungkin diinginkan (yaitu, ketika Anda ingin menggunakan konstruksi cmd seperti pipa), tetapi mereka tidak benar-benar berlaku ketika Anda dapat melakukan hal yang sama di PowerShell. Tidak ada dalam dokumentasi MSDN yang menyarankan ini diperlukan, meskipun dokumen seputar asosiasi file agak jarang.
Bob

Jawaban:

29

Tidak ada alasan bagus untuk melakukan ini. Bahkan, satu-satunya efek nyata yang terjadi adalah memperlambat segalanya.

Orang mungkin berpikir ada alasan bagus untuk melakukan ini. Menggunakan CMD memiliki efek berikut yang biasanya baik dalam beberapa kasus:

  • Mengaktifkan perintah internal, seperti " DIR"
  • Setel variabel lingkungan, seperti variabel PATH

Namun, dalam hal ini, tak satu pun dari manfaat itu diperoleh. Mari kita lihat kedua skenario ini:

Jadi, dalam beberapa kasus, ada saatnya menggunakan " CMD /C" berguna. Misalnya, jika saya menggunakan perintah eksternal PSEXEC(diunduh dari SysInternals), dan mencoba menjalankan " DIR" di komputer jarak jauh, maka Windows akan mencoba menjalankan perintah " DIR". Windows akan gagal menjalankan perintah itu karena tidak ada file " DIR.EXE", " DIR.BAT", atau " DIR" yang diakhiri dengan ekstensi lain yang didukung. (Ekstensi yang didukung dapat dilihat dengan menjalankan " ECHO %PATHEXT%".)

Namun, dalam skenario ini, jika saya mencoba menjalankan " CMD /C DIR", maka itu akan berhasil, karena Windows akan mencari yang dapat dieksekusi bernama " CMD", dan akan menemukan itu, dan kemudian CMDakan berhasil menjalankan perintah " DIR" yang merupakan internal bagian dari perintah " CMD".

Dalam hal ini, Anda bisa menjalankannya powershellsemudah " CMD /C powershell", jadi Anda tidak mendapat manfaat dari yang " CMD /C" tidak perlu . Satu-satunya keuntungan yang saya lihat melalui langkah ekstra mengetik " CMD /C" adalah memberikan contoh yang akan berguna jika seseorang memutuskan untuk mencoba memodifikasi contoh untuk menjalankan baris perintah " DIR" atau " COPY". Memiliki contoh yang lebih fleksibel mungkin bermanfaat bagi sebagian orang. Ini benar-benar tidak diperlukan ketika orang tahu apa yang mereka lakukan.

Adapun poin kedua yang saya berikan, yaitu untuk mengatur variabel lingkungan, itu juga sesuatu yang tidak Anda lakukan secara aktif dalam kasus khusus ini. Mungkin beberapa orang berpikir bahwa mereka membantu masalah dengan menyebabkan variabel lingkungan PATH ditetapkan. Namun, ketika Anda menjalankan perintah secara langsung (misalnya, dari opsi menu "Run" pada menu Start), sistem operasi Windows dapat mencari perintah di beberapa tempat tambahan. Misalnya, di Windows XP / yang lebih baru Anda dapat menjalankan:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"

Jika perintah yang ingin Anda jalankan tercantum di bawah "App Paths", Windows dapat menemukan program tersebut meskipun tidak ada di jalurnya. Jadi, Windows kemungkinan akan menemukan LEBIH BANYAK dari pada apa yang CMD temukan di PATH yang digunakan CMD.

Salah satu manfaat yang mungkin adalah jika Anda ingin CMD dijalankan sehingga Anda dapat merujuk ke variabel lingkungan seperti% USERPROFILE% atau% LOGONSERVER% atau% TEMP% /% TMP%, tetapi karena Anda tidak melakukan itu, Anda tidak perlu dijalankan " CMD /C".

Jadi, untuk kasus khusus Anda: Tidak ada alasan bagus untuk melakukannya. Efek yang Anda raih adalah membuat komputer Anda melakukan lebih banyak pekerjaan, memperlambat proses, dan menggunakan lebih banyak memori (yang semuanya Anda lakukan dengan jumlah yang dapat diabaikan pada peralatan modern).

TOOGAM
sumber
Saya setuju sepenuhnya dengan saran yang diberikan Bob. Bob membawamu ke jalan yang benar. Ketika saya membaca banyak hal, saya pikir beberapa informasi lebih mungkin membantu memberikan sedikit kejelasan lebih cepat.
TOOGAM
2
ftr - memulai proses dengan prioritas yang berbeda adalah kasus penggunaan yang baik untuk cmd /c. Sesuatu seperti cmd /c start /low Notepad.exe.
Lieven Keersmaekers
Jawaban yang bagus. Satu hal yang saya sebutkan adalah ini juga menjalankan autorun cmd , tapi itu biasanya tidak disetel, dan bahkan ketika disetel itu mungkin tidak diinginkan dalam sebuah asosiasi file. Dan Lieven membuat poin yang bagus dengan prioritas, meskipun sekali lagi saya pikir itu agak aneh untuk asosiasi file.
Bob
1
cmd sendiri tidak mengatur variabel lingkungan. Lingkungan diwarisi dari proses induk, menambahkan cmd di antaranya tidak mengubah apa pun tentang itu. App Paths hanya digunakan untuk ShellExecute, sejauh yang saya tahu, bukan untuk CreateProcess, jadi di sebagian besar keadaan (terutama di shells) itu tidak akan berlaku (Anda dapat mencobanya sendiri, pbrushadalah App Path untuk mspaintdan tidak akan bekerja di banyak tempat).
Joey
@ Joey mungkin lebih tepat untuk mengatakan itu memperluas variabel ... tapi, kalau dipikir-pikir, jika Anda menggunakan REG_EXPAND_SZAnda dapat memperluas variabel lingkungan (menggunakan yang sama %syntax%) tanpa menggunakan cmd. Kata kerja yang digunakan dalam asosiasi file dipanggil melalui ShellExecuteEx, jadi Jalur Aplikasi berlaku di sini.
Bob
18

Karena itu menghilangkan pewarnaan.

Mungkin mereka berpikir orang menganggap latar belakang biru itu mengganggu.

Mehrdad
sumber
1
Tidak memiliki Windows yang praktis, tetapi tidak bisakah Anda mengatur warna latar belakang di properti konsol?
Ruslan
1
Putus asa, meskipun menjadi jawaban yang bersaing untuk saya yang menunjukkan tidak ada alasan. Karena, ini adalah alasan yang masuk akal. Kerja bagus. Tentu saja, beberapa orang mungkin menemukan kotak hitam lebih mengganggu daripada kotak biru. Namun, itu masalah preferensi dan orang-orang dapat memiliki preferensi yang berbeda, jadi +1 memberi jawaban yang baik dan akurat. @Rusland: Ya, tetapi bisakah Anda mengatur agar perubahan itu dibuat sebelum program cepat hilang? (Dan, apakah Anda tahu apakah perubahan yang dilakukan pada satu sesi akan memengaruhi sesi lainnya. Apakah pengaturan akan berbeda antara kasus umum & yang spesifik seperti ikon desktop?)
TOOGAM
Saya tidak pernah menyadarinya karena saya menggunakan conEmu sebagai konsol default saya, yang berarti saya selalu mendapatkan jendela konsol saya yang telah dikonfigurasikan dengan baik (dengan ascii art dan custom prompt dan gif pembakaran obor. Memuat dalam waktu kurang dari 10 menit juga!)
stib
1

Dengan cmd powershell, Anda meminta shell saat ini, explorer, untuk memanggil cmd dengan parameter powershell, "imageSeqView ..."dengan nilai parsed dari% 1 hingga cmd.

Dalam hal ini, "powershell"diharapkan oleh cmd menjadi perintah cmd, exe atau salah satu skrip yang didukung cmd, misalnya bat.

Dengan powershell "imageSeqView ...", Anda meminta shell saat ini, explorer, untuk memanggil powershellparameter imageSeqView ...dengan nilai parsed dari% 1 ke PowerShell.

Dalam kasus ini, " imageSeqView" diharapkan oleh PowerShell menjadi skrip cmdlet, exe atau PowerShell.

Asalkan " imageSeqView" merupakan fungsi PowerShell, cara pertama sama sekali tidak perlu dan sedikit menurunkan kinerja.

Untuk opsi jendela perintah, ada opsi serupa di PowerShell seperti -NoExit, yang harus sama dengan / K dalam cmd.

Untuk pemasangan pipa, inisialisasi vars, PowerShell dapat melakukan hal yang sama.

chingNotCHing
sumber