PowerShell'de CMD komutunu çalıştırma


87

Çalıştırmak için bir PowerShell komutu almakla ilgili bir sürü sorun yaşıyorum. Tek yaptığı, bir CMD komut istemi penceresinde çalıştırılacak bir komutu çalıştırmaktır.

İşte komut:

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

Aşağıdakileri başarılı bir şekilde denedim (İşe yarayan birini denemek ve elde etmek için bunun birçok yinelemesini denedim. Sözdizimi muhtemelen tamamen berbattı):

$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)

Komut, kullanıcının metin kutusunda belirttiği bilgisayara SCCM uzak bağlantı penceresini açacaktır.


Hangi SCCM sürümünü kullandığınızdan emin değilim, ancak 07 "-1" gerektiriyor, ancak 2012, CmRcViewer'ı başlatırken değil. Sadece bir Bilginize.
Kevin_

Yanıtlar:


102

Bunu dene:

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

PowerShell için bir "..." dizesi yalnızca bir dizedir ve PowerShell, bunu ekrana yansıtarak değerlendirir. PowerShell'in adı bir dizede olan komutu yürütmesini sağlamak için çağrı operatörünü kullanırsınız &.


Harika, bu işe yaradı. Bu çoğu cmd komutu için çalışmalı mı?
user3585839

4
Evet ama adında veya yolunda boşluk olmayan eski sevgililer için gerekli değil. Örneğin, ipconfig.exekullanmak zorunda kalmadan çalıştırabilirsiniz &. &Kullanmanız gereken tek zaman , dize biçiminde bir komut adı çağırmaktır. Ve yolda veya dosya adında boşluk olduğunda "dize biçimi" kullanmanız gerekir.
Keith Hill

17
Bir komut satırı dizesi oluşturmanın işe yaramayacağını ve &PowerShell'in tüm dizenin çalıştırılabilir dosyanın adı olduğunu düşüneceğini ekleyeceğim. Bunun yerine, yalnızca çalıştırılabilir dosyanın adını alın ve çalıştırılabilir dosyanın parametrelerini daha sonra koyun.
Bill_Stewart

Arasındaki fark nedir &ve cmd?
Timo

1
&PowerShell çağrısı (diğer adıyla çağrı) operatörüdür. Sahip olduğunuz şey, komutun adını veya exe yolunu içeren bir dize olduğunda, bir komutu yürütmenize olanak tanır. Ayrıca bir komut dosyası bloğu, örn. &{$foo=42}Veya bir CommandIno nesnesi, örn $cmd = Get-Command Get-Date; &$cmd. cmdfarklı bir kabuktur. Not &Eğer setleri o scriptblock sonra dikkat böylece çocuk kapsamındaki yürütür $foobittikten yukarıda, $fooartık ayarlı değil.
Keith Hill

56

Toplu iş dosyalarını PowerShell'den harici olarak çalıştırmak veya dönüştürmek için (özellikle tüm zamanlanmış görev betiklerinizi bir sertifika ile imzalamak istiyorsanız) sadece bir PowerShell betiği oluşturuyorum, örn. Deletefolders.ps1.

Aşağıdakileri komut dosyasına girin:

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"

* Her komutun yeniden cmd.exe'yi çağıran yeni bir satıra yerleştirilmesi gerekir.

Bu komut dosyası artık imzalanabilir ve PowerShell'den komut istemine / cmddoğrudan komut çıktı olarak çalıştırılabilir .

Toplu iş dosyalarını çalıştırmaktan çok daha güvenli bir yoldur!


Bu benim için harika çalıştı. Çalıştırmaya çalışıyordum: sc query serviceNamePowerShell'den çalıştırılacağını düşündüm, ancak çıktı yok. Tekniğin birkaç yinelemesini denedim, zar yok. Ama tavsiye ettiğin şekilde çalıştırmak işe yaradı. Sonra cmd.exe /? beni başka hangi harikaların beklediğini görmek için. Yalnızca gerektiğinde cmd çalıştırmayı seviyorum.
Paul Masek

9

Bir çözüm olacaktır boru PowerShell CMD komut. Aşağıdaki komutu çalıştırmak, komutu notepad.exeCMD'ye yönlendirecek ve ardından Not Defteri uygulaması açılacaktır.

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

Komut CMD'de çalıştırıldıktan sonra, bir PowerShell istemine dönersiniz ve PowerShell betiğinizi çalıştırmaya devam edebilirsiniz.


Düzenlemeler

CMD'nin Başlangıç ​​Mesajı Gösteriliyor

Mklement0'ın işaret ettiği gibi , bu yöntem CMD'nin başlangıç ​​mesajını gösterir. Çıktıyı yukarıdaki yöntemi kullanarak başka bir terminale kopyalarsanız, başlangıç ​​mesajı da onunla birlikte kopyalanacaktır.


Olmadığında bile çalışabilir &. Örneğin & "mklink", çalışırken benim için işe "mklink" | cmdyaramadı
moudrick

2

Bu bilgiye ihtiyaç duyanlar için:

PATHBir PS betiğinden bir komutu çalıştırabileceğinizi ve çalışması gerektiğini anladım.

Bazen bu komutu önceden başlatmanız gerekebilir. cmd.exe /c

Örnekler

Git'i bir PS komut dosyasından çağırmak

Topluca PS komut dosyalarını kullanan bir gitistemciyi yeniden paketlemek zorunda kaldım Chocolatey(bilmeyenler için, bu Windows için bir tür uygulama mağazasıdır).

Bir keresinde, öğrendim gitolduğu PATHgibi, komutlar

$ca_bundle = git config --get http.sslCAInfo

git crtdosyanın konumunu $ca_bundledeğişkende saklayacaktır .

Bir Uygulama Aranıyor

Mevcut SO gönderisi ile bu SO gönderisinin bir kombinasyonu olan başka bir örnek , wherekomutun kullanımıdır

$java_exe = cmd.exe /c where java

java.exedosyanın konumunu $java_exedeğişkende saklayacaktır .


1
Yalnızca , gibi dahili komutlarını cmd /cçağırmanız gerekir . Aksine, harici bir programdır, bu nedenle onu doğrudan çalıştırabilirsiniz. Ancak, PowerShell'in yerleşik diğer adıyla (için ) bir ad çakışması nedeniyle, kullanmanız gerekir ; örneğin ,. mklinkwhere.exewhereWhere-Objectwhere.exewhere.exe java
mklement0

Veya Get-Commandarama yerine sadece PowerShell'i cmdmi kullanın ? $java_exe = $(Get-Command java.exe).Source
Öncekiyle

-1

Bu harici programı başlatmak için Invoke-Command cmdlet'ini kullanmalısınız. Normalde çaba sarf etmeden çalışır.

Birden fazla komuta ihtiyacınız varsa, -scriptblockseçenekle birlikte Invoke-Expression cmdlet'ini kullanmalısınız .


1
Bu durumda Invoke-Command gerekli değildir (Keith Hill'in cevabına bakın).
Bill_Stewart

Evet buna katılıyorum. Daha çok komut dosyası çözümünü düşünüyordum.
Tim Christin

4
Komutun bir komut dosyasından çalıştırılıp çalıştırılmadığı önemli değildir. Yine de bu durumda Invoke-Command kullanmak gerekli değildir.
Bill_Stewart


Lütfen örnek olmadan "cevaplar" vermeyin
AX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.