Uruchamianie polecenia CMD w PowerShell

87

Mam kilka problemów z uruchomieniem polecenia PowerShell. Wszystko, co robi, to uruchomienie polecenia, które zostanie uruchomione w oknie wiersza polecenia CMD.

Oto polecenie:

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

Próbowałem następujących bez powodzenia (próbowałem wielu iteracji, aby spróbować uzyskać taką, która działa. Składnia prawdopodobnie jest schrzaniona):

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

Polecenie po prostu otworzy okno zdalnego połączenia SCCM z komputerem określonym przez użytkownika w polu tekstowym.

user3585839
źródło
Nie jestem pewien, której wersji SCCM używasz, ale 07 wymaga "-1", ale rok 2012 nie podczas uruchamiania CmRcViewer. Tylko do Twojej wiadomości.
Kevin_,

Odpowiedzi:

101

Spróbuj tego:

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

Dla PowerShell ciąg „...” jest po prostu ciągiem i PowerShell ocenia go, wyświetlając go na ekranie. Aby PowerShell wykonał polecenie, którego nazwa jest w ciągu, użyj operatora wywołania &.

Keith Hill
źródło
Świetnie, to zadziałało. Czy powinno to działać w przypadku większości poleceń cmd?
user3585839
4
Tak, ale nie jest to konieczne w przypadku byłych, którzy nie mają spacji w nazwie lub ścieżce. Na przykład możesz wykonać ipconfig.exebez konieczności używania &. Jedynym momentem, którego potrzebujesz, &jest wywołanie nazwy polecenia w postaci ciągu. I musisz użyć „ciągu znaków”, gdy w ścieżce lub nazwie pliku jest spacja.
Keith Hill
17
Dodałbym, że nie zadziała skonstruowanie ciągu wiersza poleceń i próba wykonania z nim &, ponieważ PowerShell pomyśli, że cały ciąg jest nazwą pliku wykonywalnego. Zamiast tego podaj cytat tylko z nazwy pliku wykonywalnego, a następnie umieść jego parametry.
Bill_Stewart
Jaka jest różnica między &i cmd?
Timo
1
&jest operatorem wywołania PowerShell (aka wywołania). Pozwala na wykonanie polecenia, gdy to, co masz, jest ciągiem zawierającym nazwę polecenia lub ścieżkę do exe. Możesz również określić blok skryptu, np. &{$foo=42}Lub obiekt CommandIno, np $cmd = Get-Command Get-Date; &$cmd. cmdto inna powłoka. Zauważ, że jest &wykonywany w zakresie podrzędnym, więc zauważysz, że po zakończeniu działania bloku skryptu, który ustawiono $foopowyżej, $foonie jest już ustawiony.
Keith Hill
55

Aby uruchomić lub konwertować pliki wsadowe zewnętrznie z PowerShell (szczególnie jeśli chcesz podpisać wszystkie skrypty zaplanowanych zadań certyfikatem), po prostu tworzę skrypt PowerShell, np. Deletefolders.ps1.

Wprowadź do skryptu następujące informacje:

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"

* Każde polecenie należy umieścić w nowej linii, ponownie wywołując cmd.exe.

Ten skrypt można teraz podpisać i uruchomić z programu PowerShell, wysyłając polecenia do wiersza polecenia / cmdbezpośrednio.

Jest to znacznie bezpieczniejszy sposób niż uruchamianie plików wsadowych!

Armand G.
źródło
To działało świetnie dla mnie. Próbowałem uruchomić: sc query serviceNamez PowerShell myśląc, że się wykona, ale bez wyjścia. Wypróbowałem kilka iteracji techniki &, bez kości. Ale uruchomienie go w zalecany sposób zadziałało. Następnie trafiłem na cmd.exe /? zobaczyć, jakie inne cuda mnie czekają. Lubię uruchamiać cmd tylko wtedy, gdy jest to potrzebne.
Paul Masek
9

Jednym z rozwiązań byłoby rury Twojego polecenia z PowerShell do CMD. Uruchomienie następującego polecenia spowoduje przekazanie notepad.exepolecenia do CMD, który następnie otworzy aplikację Notatnik.

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

Po uruchomieniu polecenia w CMD nastąpi powrót do monitu programu PowerShell i będzie można kontynuować uruchamianie skryptu programu PowerShell.


Zmiany

Wyświetlany jest komunikat startowy CMD

Jak wskazuje mklement0 , ta metoda pokazuje komunikat startowy CMD. Jeśli miałbyś skopiować dane wyjściowe za pomocą powyższej metody do innego terminala, wiadomość startowa zostanie skopiowana wraz z nią.

reelyard
źródło
Może działać nawet wtedy, gdy &nie. Np. & "mklink"Nie pracował dla mnie podczas "mklink" | cmdpracy
moudrick
2

Dla tych, którzy mogą potrzebować tych informacji:

Doszedłem do wniosku, że można prawie uruchomić polecenie, które jest w twoim PATHskrypcie PS, i powinno działać.

Czasami może być konieczne wstępne uruchomienie tego polecenia za pomocą cmd.exe /c

Przykłady

Wywołanie gita ze skryptu PS

Musiałem przepakować zapakowanego gitklienta Chocolatey(dla tych, którzy mogą nie wiedzieć, jest to rodzaj sklepu z aplikacjami dla systemu Windows), który masowo używa skryptów PS.

Dowiedziałem się, że raz gitjest w PATHpoleceniach takich jak

$ca_bundle = git config --get http.sslCAInfo

zapisze lokalizację git crtpliku w $ca_bundlezmiennej.

Szukam aplikacji

Innym przykładem będącym połączeniem obecnego postu SO i tego postu SO jest użycie wherepolecenia

$java_exe = cmd.exe /c where java

zapisze lokalizację java.exepliku w $java_exezmiennej.

avi.elkharrat
źródło
1
Wystarczy cmd /cwywołać jego wewnętrzne polecenia, takie jak mklink. Z drugiej strony where.exejest to program zewnętrzny, więc możesz go wywołać bezpośrednio. Jednak ze względu na konflikt nazwy z wbudowanym wherealiasem programu PowerShell (dla Where-Object) należy użyć where.exe; np where.exe java.
mklement0
Lub po prostu użyj PowerShell Get-Commandzamiast dzwonić cmd? Tak samo jak wcześniej:$java_exe = $(Get-Command java.exe).Source
dtasev
-1

Aby uruchomić ten program zewnętrzny, należy użyć polecenia cmdlet Invoke-Command. Zwykle działa bez wysiłku.

Jeśli potrzebujesz więcej niż jednego polecenia, użyj polecenia cmdlet Invoke-Expression z -scriptblockopcją.

Tim Christin
źródło
1
W tym przypadku polecenie Invoke-Command nie jest potrzebne (patrz odpowiedź Keith Hill).
Bill_Stewart,
Tak, zgadzam się z tym. Bardziej myślałem o rozwiązaniu skryptowym.
Tim Christin,
4
Nie ma znaczenia, czy polecenie jest uruchamiane ze skryptu, czy nie. W tym przypadku nadal nie jest konieczne używanie polecenia Invoke-Command.
Bill_Stewart
Dodatkowo należy unikać Invoke-Expression
mklement0
Proszę nie podawać „odpowiedzi” bez przykładu
AX