Tại sao lại sử dụng Powershellv của Cowersdell thay vì chỉ Powershell?


25

Tôi đã thêm menu ngữ cảnh đầu tiên của mình bằng cách sử dụng sổ đăng ký theo hướng dẫn được đưa ra trong câu hỏi này (yay me).

Ban đầu tôi sử dụng nó như là lệnh mà nó thực thi, tức là giá trị của khóa "lệnh":

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

ImageSeqViewlà tên của hàm powershell của tôi, tôi nhập nó trong hồ sơ powershell của tôi. Nó hoạt động tốt, nhưng tôi tự hỏi: tại sao sử dụng cmdđể mở Powershellđể thực thi chức năng? Sẽ không đơn giản hơn nếu chỉ làm

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

Lệnh đó dường như chỉ hoạt động tốt, nhưng vì nó có vẻ hợp quy để sử dụng cmdnên tôi tự hỏi liệu nó có đang bí mật giết chó con hay không?

nhập mô tả hình ảnh ở đây


2
Không có câu trả lời nào trong việc sử dụng câu hỏi được liên kết cmd /c... cmd /kkhá khác biệt ở chỗ nó để cửa sổ mở sau khi lệnh hoàn thành. Có lẽ người hỏi đã làm theo cách đó để họ có thể thấy đầu ra cho mục đích gỡ lỗi.
Bob

1
Đó không phải là quá nhiều công cụ sửa đổi mà tôi đang tự hỏi, đó là việc sử dụng cmdtất cả, dường như có mặt khắp nơi từ nghiên cứu của tôi.
stib

Bạn có thể cung cấp một tài liệu tham khảo mà thực sự đề nghị cmd /c powershellcụ thể? Một lần nữa, một trong những bạn liên kết làm cho không có khuyến nghị như vậy.
Bob

câu trả lời được chấp nhận tại đây: social.technet.microsoft.com/Forums/scriptcenter/en-US/ mẹo
stib

3
Theo phỏng đoán, có lẽ chủ yếu là nuôi cấy hàng hóa. Có một vài trường hợp điều này có thể được mong muốn (cụ thể là khi bạn muốn sử dụng các cấu trúc cmd như đường ống), nhưng chúng không thực sự áp dụng khi bạn có thể làm điều tương tự trong quyền hạn. Không có gì trong tài liệu MSDN cho thấy điều này là cần thiết, mặc dù các tài liệu xung quanh các liên kết tệp khá thưa thớt.
Bob

Câu trả lời:


29

Không có lý do chính đáng để làm điều này. Trong thực tế, tác dụng thực sự duy nhất xảy ra là làm mọi thứ chậm lại.

Mọi người có thể nghĩ rằng có một lý do tốt để làm điều này. Sử dụng CMD có các hiệu ứng sau đây thường có thể tốt trong một số trường hợp:

  • Cho phép các lệnh nội bộ, như " DIR"
  • Đặt các biến môi trường, chẳng hạn như biến PATH

Tuy nhiên, trong trường hợp này, cả hai lợi ích đó đều không đạt được. Hãy xem xét cả hai tình huống sau:

Vì vậy, trong một số trường hợp, có thể có một thời gian khi sử dụng " CMD /C" là hữu ích. Ví dụ: nếu tôi sử dụng lệnh bên ngoài PSEXEC(được tải xuống từ SysIternals) và thử chạy " DIR" trên máy tính từ xa, thì Windows sẽ thử chạy DIRlệnh "". Windows sẽ không chạy lệnh đó vì không có tệp " DIR.EXE", " DIR.BAT" hoặc " DIR" kết thúc bằng một phần mở rộng được hỗ trợ khác. (Có thể xem các tiện ích mở rộng được hỗ trợ bằng cách chạy " ECHO %PATHEXT%".)

Tuy nhiên, trong trường hợp này, nếu tôi cố chạy " CMD /C DIR", thì nó sẽ hoạt động, bởi vì Windows sẽ tìm kiếm một tệp thực thi có tên " CMD" và sẽ tìm thấy nó, và sau đó CMDsẽ chạy thành công DIRlệnh "" là một nội bộ một phần của CMDlệnh "".

Trong trường hợp này, bạn chỉ có thể chạy powershelldễ dàng như " CMD /C powershell", do đó bạn không nhận được lợi ích gì từ "" không cần thiết CMD /C. Lợi ích duy nhất tôi thấy là trải qua bước thêm " CMD /C" là cung cấp một ví dụ sẽ hữu ích nếu ai đó quyết định thử sửa đổi một ví dụ để chạy dòng lệnh " DIR" hoặc " COPY". Có một ví dụ linh hoạt hơn có thể hữu ích cho một số người. Nó thực sự không cần thiết khi mọi người biết họ đang làm gì.

Đối với điểm đạn thứ hai tôi cung cấp, đó là đặt các biến môi trường, đó cũng là điều mà bạn không chủ động thực hiện trong trường hợp cụ thể này. Có thể một số người nghĩ rằng họ đang giúp đỡ các vấn đề bằng cách làm cho biến môi trường PATH được đặt. Tuy nhiên, khi bạn chạy các lệnh trực tiếp (ví dụ: từ tùy chọn menu "Chạy" của menu Bắt đầu), hệ điều hành Windows có thể tìm kiếm các lệnh ở một số vị trí bổ sung. Chẳng hạn, trong Windows XP / mới hơn, bạn có thể chạy:

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

Nếu lệnh bạn muốn chạy được liệt kê trong "Đường dẫn ứng dụng", Windows có thể tìm thấy chương trình ngay cả khi nó không nằm trong đường dẫn. Vì vậy, Windows có khả năng tìm thấy nhiều hơn cả những gì mà CMD sẽ tìm thấy trong PATH mà CMD sử dụng.

Một lợi ích có thể là nếu bạn muốn chạy CMD để bạn có thể tham khảo biến môi trường như% USERPROFILE% hoặc% LOGONSERVER% hoặc% TEMP% /% TMP%, nhưng vì bạn không làm vậy, nên bạn không làm vậy cần chạy " CMD /C".

Vì vậy, đối với trường hợp cụ thể của bạn: Không có lý do chính đáng để làm điều đó. Những hiệu ứng bạn đang đạt được là khiến máy tính của bạn làm được nhiều việc hơn, làm chậm quá trình và sử dụng nhiều bộ nhớ hơn (tất cả những gì bạn đang làm với số lượng không đáng kể trên thiết bị hiện đại).


Tôi hoàn toàn đồng ý với lời khuyên mà Bob đã đưa ra. Bob đã dẫn bạn xuống một con đường đúng. Tuy nhiên, khi tôi đọc mọi thứ, tôi nghĩ rằng một số thông tin có thể giúp cung cấp rõ ràng hơn một chút nhanh chóng.
TẤT CẢ NGÀY

2
ftr - bắt đầu một quá trình với một ưu tiên khác là một trường hợp sử dụng tốt cho cmd /c. Một cái gì đó như cmd /c start /low Notepad.exe.
Lieven Keersmaekers

Câu trả lời tốt. Một điều tôi đã đề cập là điều này cũng chạy autorun của cmd , nhưng điều đó thường không được đặt và ngay cả khi nó được đặt, nó có thể không được mong muốn trong một liên kết tệp. Và Lieven làm cho một điểm tốt với sự ưu tiên, mặc dù một lần nữa tôi nghĩ rằng đó là một chút kỳ lạ cho một hiệp hội tập tin.
Bob

1
Bản thân cmd không đặt biến môi trường. Môi trường được kế thừa từ tiến trình cha, thêm cmd vào giữa không thay đổi bất cứ điều gì về điều đó. Đường dẫn ứng dụng chỉ được sử dụng cho ShellExecute, theo như tôi biết, không phải cho CreatProcess, vì vậy, trong hầu hết các trường hợp (đặc biệt là trong trình bao), những ứng dụng này sẽ không áp dụng (bạn có thể tự thử, pbrushlà Đường dẫn ứng dụng mspaintvà sẽ không hoạt động nhiều nơi).
Joey

@Joey có lẽ đúng hơn khi nói rằng nó mở rộng các biến ... nhưng, hãy nghĩ về nó, nếu bạn sử dụng, REG_EXPAND_SZbạn có thể mở rộng các biến môi trường (sử dụng tương tự %syntax%) mà không cần gọi cmd. Các động từ được sử dụng trong các liên kết tệp được gọi thông qua ShellExecuteEx, vì vậy Đường dẫn ứng dụng được áp dụng ở đây.
Bob

18

Bởi vì nó được loại bỏ các màu.

Có thể là họ nghĩ rằng mọi người tìm thấy nền màu xanh gây mất tập trung.


1
Không có Windows tiện dụng, nhưng bạn không thể đặt màu nền trong thuộc tính của bàn điều khiển?
Ruslan

1
Nâng cao, mặc dù là một câu trả lời cạnh tranh với tôi cho thấy không có lý do. Bởi vì, đây là một lý do hợp lý. Làm tốt lắm. Tất nhiên, một số người có thể thấy hộp đen gây mất tập trung hơn hộp màu xanh. Tuy nhiên, đó là vấn đề ưu tiên và mọi người có thể có các ưu tiên khác nhau, vì vậy +1 cho câu trả lời hay và chính xác. @Rusland: Vâng, nhưng bạn có thể quản lý để thực hiện thay đổi đó trước khi một chương trình nhanh chóng biến mất không? (Và, bạn có biết liệu các thay đổi được thực hiện cho một phiên sẽ ảnh hưởng đến các phiên khác hay không. Các cài đặt sẽ khác nhau giữa các trường hợp chung và các trường hợp cụ thể như biểu tượng trên máy tính để bàn?)
QUÁN NGÀY

Tôi không bao giờ nhận thấy điều đó bởi vì tôi sử dụng conEmu làm bảng điều khiển mặc định của mình, nghĩa là tôi luôn nhận được cửa sổ bảng điều khiển được cấu hình độc đáo của mình (với nghệ thuật ascii và lời nhắc tùy chỉnh và gifs của ngọn đuốc. Tải trong dưới 10 phút nữa!)
stib

1

Với cmd powershell, bạn yêu cầu shell hiện tại, explorer, gọi cmd với các tham số powershell, "imageSeqView ..."có giá trị được phân tích cú pháp từ% 1 đến cmd.

Trong trường hợp này, "powershell"được cmd dự kiến ​​là lệnh cmd, exe hoặc một trong các tập lệnh được hỗ trợ của cmd, ví dụ: bat.

Với powershell "imageSeqView ...", bạn yêu cầu shell hiện tại, explorer, gọi powershellcác tham số imageSeqView ...có giá trị được phân tích cú pháp% 1 đến powershell.

Trong trường hợp này, " imageSeqView" được dự đoán bởi powershell là một lệnh ghép ngắn, exe hoặc script powershell.

Với điều kiện " imageSeqView" là một hàm powershell, cách thứ 1 là hoàn toàn không cần thiết và làm giảm hiệu suất một chút.

Đối với các tùy chọn cửa sổ lệnh, có các tùy chọn tương tự trong powershell, chẳng hạn như -NoExit, sẽ giống như / K trong cmd.

Đối với ống lót, khởi tạo env vars, powershell có thể làm như nhau.

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.