Menjalankan perintah CMD di PowerShell

87

Saya mengalami banyak masalah dengan menjalankan perintah PowerShell. Yang dilakukannya hanyalah menjalankan perintah yang akan dijalankan di jendela prompt CMD.

Ini perintahnya:

"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Saya telah mencoba yang berikut ini tetapi tidak berhasil (saya telah mencoba banyak iterasi untuk mencoba dan mendapatkan yang berfungsi. Sintaks mungkin semuanya kacau):

$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)

Perintah ini hanya akan membuka jendela koneksi jarak jauh SCCM ke komputer yang ditentukan pengguna di kotak teks.

pengguna3585839
sumber
Saya tidak yakin versi SCCM mana yang Anda gunakan, tetapi 07 memerlukan "-1", tetapi tahun 2012 tidak saat meluncurkan CmRcViewer. Hanya FYI.
Kevin_

Jawaban:

102

Coba ini:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Bagi PowerShell, string "..." hanyalah string dan PowerShell mengevaluasinya dengan menggemakannya ke layar. Untuk membuat PowerShell menjalankan perintah yang namanya ada dalam string, Anda menggunakan operator panggilan &.

Keith Hill
sumber
Luar biasa, ini berhasil. Haruskah itu berfungsi untuk sebagian besar perintah cmd?
pengguna3585839
4
Ya, tetapi tidak perlu bagi mantan yang tidak memiliki spasi di nama atau jalurnya. Misalnya, Anda dapat mengeksekusi ipconfig.exetanpa harus menggunakan &. Satu-satunya saat Anda perlu menggunakan &adalah memanggil nama perintah dalam bentuk string. Dan Anda harus menggunakan "bentuk string" jika ada spasi di jalur atau nama file.
Keith Hill
17
Saya akan menambahkan bahwa itu tidak akan berfungsi untuk membangun string baris perintah dan mencoba mengeksekusi dengan &, karena PowerShell akan berpikir seluruh string adalah nama yang dapat dieksekusi. Alih-alih mengutip hanya nama yang dapat dieksekusi dan letakkan parameter yang dapat dieksekusi sesudahnya.
Bill_Stewart
Apa perbedaan antara &dan cmd?
Timo
1
&adalah operator panggilan PowerShell (alias pemanggilan). Ini memungkinkan Anda untuk menjalankan perintah ketika apa yang Anda miliki adalah string yang berisi nama perintah atau jalur ke exe. Anda juga dapat menentukan scriptblock misalnya &{$foo=42}atau objek CommandIno misalnya $cmd = Get-Command Get-Date; &$cmd. cmdadalah cangkang yang berbeda. Perhatikan bahwa &mengeksekusi dalam lingkup anak sehingga Anda akan mencatat bahwa setelah blok skrip yang disetel di $fooatas selesai, $footidak disetel lagi.
Keith Hill
56

Untuk menjalankan atau mengonversi file batch secara eksternal dari PowerShell (terutama jika Anda ingin menandatangani semua skrip tugas terjadwal Anda dengan sertifikat) saya cukup membuat skrip PowerShell, misalnya deletefolders.ps1.

Masukkan yang berikut ke dalam skrip:

cmd.exe /c "rd /s /q C:\#TEMP\test1"

cmd.exe /c "rd /s /q C:\#TEMP\test2"

cmd.exe /c "rd /s /q C:\#TEMP\test3"

* Setiap perintah harus diletakkan di baris baru yang memanggil cmd.exe lagi.

Skrip ini sekarang dapat ditandatangani dan dijalankan dari PowerShell dengan mengeluarkan perintah ke command prompt / cmdsecara langsung.

Ini adalah cara yang jauh lebih aman daripada menjalankan file batch!

Armand G.
sumber
Ini bekerja dengan baik untuk saya. Saya mencoba untuk menjalankan: sc query serviceNamedari PowerShell berpikir itu akan dijalankan, tetapi tidak ada keluaran. Saya mencoba beberapa iterasi dari & teknik, tanpa dadu. Tetapi menjalankannya seperti yang Anda rekomendasikan berhasil. Selanjutnya saya menekan cmd.exe /? untuk melihat keajaiban lain apa yang menanti saya. Saya hanya suka menjalankan cmd saat dibutuhkan.
Paul Masek
9

Salah satu solusinya adalah menyalurkan perintah Anda dari PowerShell ke CMD. Menjalankan perintah berikut akan mengirimkan notepad.exeperintah tersebut ke CMD, yang kemudian akan membuka aplikasi Notepad.

PS C:\> "notepad.exe" | cmd

Setelah perintah dijalankan di CMD, Anda akan kembali ke prompt PowerShell, dan dapat terus menjalankan skrip PowerShell Anda.


Editan

Pesan Startup CMD Ditampilkan

Seperti yang ditunjukkan mklement0 , metode ini menampilkan pesan startup CMD. Jika Anda menyalin output menggunakan metode di atas ke terminal lain, pesan startup akan disalin bersamanya.

reelyard
sumber
Itu bisa bekerja bahkan ketika &tidak. Misalnya & "mklink"tidak bekerja untuk saya saat "mklink" | cmdbekerja
moudrick
2

Bagi mereka yang mungkin membutuhkan info ini:

Saya menemukan bahwa Anda dapat menjalankan cukup banyak perintah yang ada di Anda PATHdari skrip PS, dan itu akan berfungsi.

Terkadang Anda mungkin harus meluncurkan perintah ini sebelumnya dengan cmd.exe /c

Contoh

Memanggil git dari skrip PS

Saya harus mengemas ulang gitklien yang dibungkus Chocolatey(bagi mereka yang mungkin tidak tahu, ini semacam toko aplikasi untuk Windows) yang secara masif menggunakan skrip PS.

Saya menemukan bahwa, sekali gitada di PATH, perintah seperti

$ca_bundle = git config --get http.sslCAInfo

akan menyimpan lokasi git crtfile dalam $ca_bundlevariabel.

Mencari Aplikasi

Contoh lain yang merupakan kombinasi dari pos SO saat ini dan pos SO ini adalah penggunaan whereperintah

$java_exe = cmd.exe /c where java

akan menyimpan lokasi java.exefile dalam $java_exevariabel.

avi.elkharrat
sumber
1
Anda hanya perlu cmd /cmenjalankan perintah internalnya , seperti mklink. Sebaliknya, where.exeadalah program eksternal, sehingga Anda dapat menjalankannya secara langsung. Namun, karena konflik nama dengan wherealias bawaan PowerShell (untuk Where-Object), Anda harus menggunakan where.exe; misalnya where.exe java,.
mklement0
Atau cukup gunakan PowerShell Get-Commandalih - alih menelepon cmd? Sama seperti sebelumnya:$java_exe = $(Get-Command java.exe).Source
dtasev
-1

Anda harus menggunakan cmdlet Perintah Panggil untuk meluncurkan program eksternal ini. Biasanya ini bekerja tanpa usaha.

Jika Anda membutuhkan lebih dari satu perintah, Anda harus menggunakan cmdlet Invoke-Expression dengan -scriptblockopsi.

Tim Christin
sumber
1
Invoke-Command tidak diperlukan dalam kasus ini (lihat jawaban Keith Hill).
Bill_Stewart
Ya saya setuju dengan itu. Saya lebih memikirkan solusi scripting.
Tim Christin
4
Tidak masalah apakah perintah dijalankan dari skrip atau tidak. Dalam kasus ini, masih tidak perlu menggunakan Invoke-Command.
Bill_Stewart
Selain itu, Invoke-Expression harus dihindari
mklement0
Tolong jangan berikan "jawaban" tanpa contoh
AX