Chạy lệnh CMD trong PowerShell


87

Tôi đang gặp một số vấn đề với việc chạy lệnh PowerShell. Tất cả những gì nó đang làm là chạy một lệnh sẽ được chạy trong cửa sổ nhắc CMD.

Đây là lệnh:

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

Tôi đã thử những cách sau nhưng không thành công (Tôi đã thử nhiều lần lặp lại điều này để thử và nhận được một cái hoạt động. Cú pháp có thể đã bị hỏng):

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

Lệnh sẽ chỉ mở cửa sổ kết nối từ xa SCCM với máy tính mà người dùng chỉ định trong hộp văn bản.


Tôi không chắc bạn đang sử dụng phiên bản SCCM nào, nhưng 07 yêu cầu "-1", nhưng 2012 thì không khi khởi chạy CmRcViewer. Chỉ là một FYI.
Kevin_

Câu trả lời:


101

Thử đi:

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

Đối với PowerShell, một chuỗi "..." chỉ là một chuỗi và PowerShell đánh giá nó bằng cách lặp lại nó với màn hình. Để PowerShell thực thi lệnh có tên trong một chuỗi, bạn sử dụng toán tử cuộc gọi &.


Tuyệt vời, điều này đã hoạt động. Điều đó có hoạt động cho hầu hết các lệnh cmd không?
user3585839,

4
Có nhưng nó không cần thiết đối với những người yêu cũ không có dấu cách trong tên hoặc đường dẫn của họ. Ví dụ, bạn có thể thực thi ipconfig.exemà không cần phải sử dụng &. Lần duy nhất bạn cần sử dụng &là gọi một tên lệnh ở dạng chuỗi. Và bạn phải sử dụng "dạng chuỗi" khi có khoảng trắng trong đường dẫn hoặc tên tệp.
Keith Hill,

17
Tôi sẽ nói thêm rằng nó sẽ không hoạt động khi xây dựng một chuỗi dòng lệnh và cố gắng thực thi với &, vì PowerShell sẽ nghĩ rằng toàn bộ chuỗi là tên của tệp thực thi. Thay vào đó, chỉ trích dẫn tên của tệp thực thi và đặt các tham số của tệp thực thi sau đó.
Bill_Stewart

Sự khác biệt giữa &và là cmdgì?
Timo

1
&là toán tử cuộc gọi PowerShell (còn gọi là lệnh gọi). Nó cho phép bạn thực thi một lệnh khi những gì bạn có là một chuỗi chứa tên của lệnh hoặc đường dẫn đến exe. Bạn cũng có thể chỉ định một ví dụ scriptblock &{$foo=42}hoặc một đối tượng CommandIno chẳng hạn $cmd = Get-Command Get-Date; &$cmd. cmdlà một lớp vỏ khác. Lưu ý rằng &thực thi trong phạm vi con, vì vậy bạn sẽ lưu ý rằng sau khi scriptblock đặt $fooở trên kết thúc, $foonó sẽ không được đặt nữa.
Keith Hill

55

Để chạy hoặc chuyển đổi hàng loạt tệp bên ngoài từ PowerShell (đặc biệt nếu bạn muốn ký tất cả các tập lệnh tác vụ đã lên lịch của mình bằng chứng chỉ), tôi chỉ cần tạo một tập lệnh PowerShell, ví dụ: deletefolders.ps1.

Nhập nội dung sau vào tập lệnh:

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"

* Mỗi lệnh cần được đặt trên một dòng mới gọi lại cmd.exe.

Tập lệnh này hiện có thể được ký và chạy từ PowerShell xuất các lệnh tới dấu nhắc lệnh / cmdtrực tiếp.

Đó là một cách an toàn hơn nhiều so với chạy các tệp hàng loạt!


Nó hiệu quả tuyệt vời đối với tôi. Tôi đang cố chạy: sc query serviceNametừ PowerShell nghĩ rằng nó sẽ thực thi, nhưng không có đầu ra. Tôi đã thử nhiều lần lặp lại kỹ thuật &, không có xúc xắc. Nhưng chạy nó theo cách bạn đề xuất đã hoạt động. Tiếp theo tôi nhấn cmd.exe /? để xem những điều kỳ diệu khác đang chờ đợi tôi. Tôi chỉ thích chạy cmd khi cần thiết.
Paul Masek

9

Một giải pháp sẽ được ống lệnh của bạn từ PowerShell để CMD. Chạy lệnh sau sẽ chuyển notepad.exelệnh tới CMD, sau đó sẽ mở ứng dụng Notepad.

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

Khi lệnh đã chạy trong CMD, bạn sẽ được đưa trở lại lời nhắc PowerShell và có thể tiếp tục chạy tập lệnh PowerShell của mình.


Chỉnh sửa

Thông điệp khởi động của CMD được hiển thị

Như mklement0 đã chỉ ra, phương pháp này hiển thị thông báo khởi động của CMD. Nếu bạn sao chép đầu ra bằng phương pháp trên vào một thiết bị đầu cuối khác, thông báo khởi động sẽ được sao chép cùng với nó.


Nó có thể hoạt động ngay cả khi &không. Ví dụ: & "mklink"không làm việc cho tôi trong khi "mklink" | cmdlàm việc
moudrick

2

Đối với những người có thể cần thông tin này:

Tôi đã phát hiện ra rằng bạn có thể chạy khá nhiều lệnh trong PATHtập lệnh PS và nó sẽ hoạt động.

Đôi khi bạn có thể phải khởi chạy trước lệnh này với cmd.exe /c

Ví dụ

Gọi git từ tập lệnh PS

Tôi đã phải đóng gói lại một gitứng dụng khách được bao bọc trong Chocolatey(đối với những người có thể không biết, đó là một loại cửa hàng ứng dụng dành cho Windows) sử dụng ồ ạt các tập lệnh PS.

Tôi phát hiện ra rằng, một khi gittrong PATHlệnh, các lệnh như

$ca_bundle = git config --get http.sslCAInfo

sẽ lưu trữ vị trí của git crttệp trong $ca_bundlebiến.

Tìm kiếm ứng dụng

Một ví dụ khác là sự kết hợp của bài SO hiện tại và bài SO này là việc sử dụng wherelệnh

$java_exe = cmd.exe /c where java

sẽ lưu trữ vị trí của java.exetệp trong $java_exebiến.


1
Bạn chỉ cần cmd /cgọi các lệnh bên trong của nó , chẳng hạn như mklink. Ngược lại, where.exelà một chương trình bên ngoài, vì vậy bạn có thể gọi nó trực tiếp. Tuy nhiên, do xung đột tên với wherebí danh tích hợp sẵn của PowerShell (cho Where-Object), bạn phải sử dụng where.exe; vd where.exe java.
mklement0

Hay chỉ sử dụng PowerShell's Get-Commandthay vì gọi điện cmd? Giống như trước:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

Bạn phải sử dụng lệnh ghép ngắn Invoke-Command để khởi chạy chương trình bên ngoài này. Bình thường nó hoạt động mà không cần nỗ lực.

Nếu bạn cần nhiều hơn một lệnh, bạn nên sử dụng lệnh ghép ngắn Gọi biểu thức với -scriptblocktùy chọn.


1
Invoke-Command không cần thiết trong trường hợp này (xem câu trả lời của Keith Hill).
Bill_Stewart

Vâng, tôi đồng ý với điều đó. Tôi đã suy nghĩ nhiều hơn về giải pháp viết kịch bản.
Tim Christin

4
Không quan trọng là lệnh có được chạy từ tập lệnh hay không. Vẫn không cần thiết phải sử dụng Invoke-Command trong trường hợp này.
Bill_Stewart


Vui lòng không cung cấp "câu trả lời" mà không có ví dụ
AX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.