เหตุใดจึงต้องใช้“ Cmd / c Powershell” แทนที่จะเป็นเพียง“ Powershell”


25

ฉันได้เพิ่มเมนูบริบทแรกของฉันโดยใช้รีจิสทรีตามคำแนะนำในคำถามนี้ (ใช่ฉัน)

ฉันเดิมใช้สิ่งนี้เป็นคำสั่งที่เรียกใช้นั่นคือค่าของคีย์ "command":

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

ImageSeqViewเป็นชื่อของฟังก์ชั่น powershell ของฉันฉันนำเข้ามาในโปรไฟล์ powershell ของฉัน มันใช้งานได้ดี แต่ฉันสงสัยว่า: ทำไมcmdต้องเปิดPowershellเพื่อใช้ฟังก์ชั่น? มันจะง่ายกว่าไหมถ้าจะทำ

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

คำสั่งนั้นดูเหมือนว่าจะทำงานได้ดี แต่เนื่องจากดูเหมือนว่ามาตรฐานที่ใช้cmdฉันสงสัยว่ามันฆ่าลูกสุนัขหรือบางสิ่งบางอย่าง?

ป้อนคำอธิบายรูปภาพที่นี่


2
ไม่มีคำตอบในคำถามที่เชื่อมโยงใช้cmd /c... cmd /kค่อนข้างแตกต่างกันซึ่งจะทำให้หน้าต่างเปิดหลังจากคำสั่งเสร็จสมบูรณ์ สมมุติว่าผู้ถามทำเช่นนั้นเพื่อให้พวกเขาสามารถเห็นผลลัพธ์สำหรับวัตถุประสงค์ในการดีบั๊ก
Bob

1
มันไม่ได้ปรับเปลี่ยนมากนักที่ฉันสงสัยเกี่ยวกับการใช้งานของcmdเลยซึ่งดูเหมือนว่าแพร่หลายจากการวิจัยของฉัน
stib

คุณสามารถให้การอ้างอิงที่แนะนำจริง ๆcmd /c powershellโดยเฉพาะได้หรือไม่? อีกครั้งสิ่งที่คุณเชื่อมโยงนั้นไม่ได้เป็นการแนะนำ
Bob

คำตอบที่ยอมรับได้ที่นี่: social.technet.microsoft.com/Forums/scriptcenter/en-US/…
stib

3
โดยการเดาว่ามันน่าจะเป็นการเพาะปลูกสินค้า มีบางกรณีที่สิ่งนี้อาจเป็นที่ต้องการ (กล่าวคือเมื่อคุณต้องการใช้คำสั่ง cmd constructs เช่น piping) แต่พวกเขาไม่ได้ใช้จริง ๆ เมื่อคุณสามารถทำเช่นเดียวกันใน powershell ต่อไป ไม่มีอะไรในเอกสารประกอบของ MSDN ที่แนะนำสิ่งนี้ว่ามีความจำเป็นแม้ว่าเอกสารที่เกี่ยวข้องกับการเชื่อมโยงไฟล์จะค่อนข้างกระจัดกระจาย
บ๊อบ

คำตอบ:


29

ไม่มีเหตุผลที่ดีที่จะทำเช่นนี้ ในความเป็นจริงผลกระทบที่เกิดขึ้นจริงเพียงอย่างเดียวคือการทำให้สิ่งต่าง ๆ ช้าลง

ผู้คนอาจคิดว่ามีเหตุผลที่ดีในการทำเช่นนี้ การใช้ CMD มีผลต่อไปนี้ซึ่งโดยทั่วไปสามารถทำได้ดีในบางกรณี:

  • เปิดใช้งานคำสั่งภายในเช่น " DIR"
  • ตั้งค่าตัวแปรสภาพแวดล้อมเช่นตัวแปร PATH

อย่างไรก็ตามในกรณีนี้ไม่ได้รับผลประโยชน์เหล่านั้น ลองดูสถานการณ์ทั้งสองนี้:

ดังนั้นในบางกรณีอาจมีเวลาที่การใช้ " CMD /C" มีประโยชน์ ตัวอย่างเช่นถ้าฉันใช้คำสั่งภายนอกPSEXEC(ดาวน์โหลดจาก SysInternals) แล้วลองเรียกใช้ " DIR" บนคอมพิวเตอร์ระยะไกล Windows จะพยายามเรียกใช้DIRคำสั่ง "" Windows จะไม่สามารถเรียกใช้คำสั่งนั้นได้เนื่องจากไม่มีไฟล์ " DIR.EXE", " DIR.BAT" หรือ " DIR" ซึ่งลงท้ายด้วยนามสกุลที่รองรับอื่น (ส่วนขยายที่รองรับสามารถดูได้โดยเรียกใช้ " ECHO %PATHEXT%")

อย่างไรก็ตามในสถานการณ์นี้ถ้าฉันพยายามเรียกใช้ " CMD /C DIR" นั่นจะทำงานได้เพราะ Windows จะมองหาไฟล์ปฏิบัติการที่ชื่อ " CMD" และจะพบว่าแล้วCMDจะจบลงด้วยการเรียกใช้DIRคำสั่ง "" ซึ่งเป็นภายในได้สำเร็จ ส่วนหนึ่งของCMDคำสั่ง ""

ในกรณีนี้คุณสามารถเรียกใช้ได้powershellอย่างง่ายดายเหมือนกับ " CMD /C powershell" ดังนั้นคุณจะไม่ได้รับประโยชน์จากสิ่งที่ไม่จำเป็น " CMD /C" ประโยชน์เพียงอย่างเดียวที่ฉันเห็นในขั้นตอนพิเศษของการพิมพ์ " CMD /C" คือการให้ตัวอย่างซึ่งจะมีประโยชน์หากมีคนตัดสินใจลองปรับเปลี่ยนตัวอย่างเพื่อเรียกใช้บรรทัดคำสั่ง " DIR" หรือ " COPY" การมีตัวอย่างที่ยืดหยุ่นมากขึ้นอาจเป็นประโยชน์สำหรับบางคน มันไม่จำเป็นจริงๆเมื่อผู้คนรู้ว่าพวกเขากำลังทำอะไร

สำหรับสัญลักษณ์แสดงหัวข้อย่อยที่สองที่ฉันให้ซึ่งเป็นการตั้งค่าตัวแปรสภาพแวดล้อมนั่นเป็นสิ่งที่คุณไม่ได้ทำในกรณีนี้ บางทีบางคนคิดว่าพวกเขากำลังช่วยเรื่องต่าง ๆ โดยทำให้ตัวแปรสภาพแวดล้อมของเส้นทางถูกตั้งค่า อย่างไรก็ตามเมื่อคุณเรียกใช้คำสั่งโดยตรง (เช่นจากตัวเลือกเมนู "เรียกใช้" ของเมนูเริ่ม) ระบบปฏิบัติการ Windows อาจค้นหาคำสั่งในบางสถานที่เพิ่มเติม ตัวอย่างเช่นใน Windows XP / ใหม่กว่าคุณสามารถเรียกใช้:

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

หากคำสั่งที่คุณต้องการเรียกใช้อยู่ในรายการภายใต้ "เส้นทางของแอป" Windows อาจค้นหาโปรแกรมแม้ว่าจะไม่ได้อยู่ในเส้นทาง ดังนั้น Windows น่าจะพบมากกว่าสิ่งที่ CMD จะพบใน PATH ที่ CMD ใช้

ข้อดีอย่างหนึ่งที่เป็นไปได้คือถ้าคุณต้องการให้ CMD ทำงานเพื่อให้คุณสามารถอ้างถึงตัวแปรสภาพแวดล้อมเช่น% USERPROFILE% หรือ% LOGONSERVER% หรือ% TEMP% /% TMP% แต่เนื่องจากคุณไม่ได้ทำเช่นนั้น จำเป็นต้องเรียกใช้ " CMD /C"

ดังนั้นสำหรับกรณีเฉพาะของคุณ: ไม่มีเหตุผลที่ดีที่จะทำ เอฟเฟกต์ที่คุณประสบความสำเร็จคือการทำให้คอมพิวเตอร์ของคุณทำงานได้มากขึ้นทำให้กระบวนการทำงานช้าลงและใช้หน่วยความจำเพิ่มขึ้น


ฉันเห็นด้วยอย่างเต็มที่กับคำแนะนำที่บ๊อบให้ บ๊อบพาคุณไปสู่เส้นทางที่ถูกต้อง ในขณะที่ฉันอ่านสิ่งต่าง ๆ ฉันคิดว่าข้อมูลเพิ่มเติมบางอย่างอาจช่วยให้ชัดเจนขึ้นเล็กน้อย
TOOGAM

2
FTR - cmd /cเริ่มต้นกระบวนการที่มีความสำคัญที่แตกต่างกันคือกรณีการใช้งานที่ดีสำหรับ cmd /c start /low Notepad.exeสิ่งที่ชอบ
Lieven Keersmaekers

คำตอบที่ดี. สิ่งหนึ่งที่ฉันจะกล่าวถึงก็คือสิ่งนี้ยังทำงานอัตโนมัติของ cmd แต่ก็ไม่ได้ตั้งค่าและแม้ว่ามันจะถูกตั้งค่ามันอาจไม่ต้องการในการเชื่อมโยงไฟล์ และ Lieven ให้ความสำคัญกับลำดับความสำคัญ แต่ฉันคิดว่ามันแปลกไปหน่อยสำหรับการเชื่อมโยงไฟล์
Bob

1
cmd เองไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม สภาพแวดล้อมได้รับการสืบทอดมาจากกระบวนการหลักโดยการเพิ่ม cmd เข้ามาจะไม่เปลี่ยนแปลงอะไรเลย แอพพา ธ ใช้สำหรับ ShellExecute เท่าที่ฉันรู้ไม่ใช่สำหรับ CreateProcess ดังนั้นในสถานการณ์ส่วนใหญ่ (โดยเฉพาะอย่างยิ่งในเชลล์) ที่จะไม่นำไปใช้ (คุณสามารถลองด้วยตัวเองpbrushเป็นเส้นทางแอปmspaintและจะไม่ทำงานใน หลายที่).
Joey

@ โจอี้อาจจะถูกต้องมากขึ้นในการพูดว่ามันขยายตัวแปร ... แต่ลองคิดดูสิถ้าคุณใช้REG_EXPAND_SZคุณสามารถขยายตัวแปรสภาพแวดล้อม (ใช้เหมือนกัน%syntax%) โดยไม่ต้องเรียกใช้ cmd คำกริยาที่ใช้ในการเชื่อมโยงไฟล์นั้นถูกเรียกใช้ผ่านทางShellExecuteExดังนั้น App Paths จึงสามารถใช้ได้ที่นี่
Bob

18

เพราะมันกำจัดสี

อาจเป็นได้ว่าพวกเขาคิดว่าผู้คนพบพื้นหลังสีน้ำเงินที่ทำให้เสียสมาธิ


1
ไม่มี Windows ที่มีประโยชน์ แต่คุณไม่สามารถตั้งค่าสีพื้นหลังในคุณสมบัติคอนโซลได้หรือไม่
Ruslan

1
การลุกฮือแม้จะเป็นคำตอบที่แข่งขันกับฉันซึ่งแสดงให้เห็นว่าไม่มีเหตุผล เพราะนี่เป็นเหตุผลที่สมเหตุสมผล ทำได้ดีมาก แน่นอนว่าบางคนอาจพบว่ากล่องดำมีสมาธิมากกว่ากล่องสีน้ำเงิน อย่างไรก็ตามนั่นเป็นเรื่องของการตั้งค่าและผู้คนสามารถมีความต้องการที่แตกต่างกันดังนั้น +1 สำหรับคำตอบที่ดีและถูกต้อง @Rusland: ใช่ แต่คุณสามารถจัดการกับการเปลี่ยนแปลงที่เกิดขึ้นก่อนที่โปรแกรมอย่างรวดเร็วจะหายไปได้หรือไม่? (และคุณรู้หรือไม่ว่าการเปลี่ยนแปลงที่เกิดขึ้นกับหนึ่งเซสชันจะมีผลกับเซสชันอื่นหรือไม่การตั้งค่าจะแตกต่างกันระหว่างกรณีทั่วไปและเฉพาะบางอย่างเช่นไอคอนบนเดสก์ท็อปหรือไม่)
TOOGAM

ฉันไม่เคยสังเกตเห็นเพราะฉันใช้ conEmu เป็นคอนโซลเริ่มต้นของฉันซึ่งหมายความว่าฉันจะได้รับหน้าต่างคอนโซลที่กำหนดค่าไว้เสมอ (พร้อม ascii art และพร้อมท์ที่กำหนดเองและ gifs ของไฟฉายเผาไหม้โหลดภายในไม่เกิน 10 นาที!)
stib

1

ด้วยcmd powershell, คุณขอให้เชลล์ปัจจุบัน, explorer, เรียกใช้ cmd ด้วยพารามิเตอร์ที่powershell, "imageSeqView ..."มีค่าแจง% 1 ถึง cmd

ในกรณี"powershell"นี้คาดว่า cmd จะเป็นทั้งคำสั่ง cmd, exe หรือสคริปต์ที่สนับสนุนของ cmd เช่น bat

ด้วยpowershell "imageSeqView ...", คุณขอให้เชลล์ปัจจุบัน, explorer, เพื่อเรียกใช้powershellพารามิเตอร์ที่imageSeqView ...มีค่าการแยกวิเคราะห์ของ% 1 ถึง powershell

ในกรณีนี้ " imageSeqView" PowerShell คาดว่าจะเป็น cmdlet, exe หรือสคริปต์ PowerShell

โดยมีเงื่อนไขว่า " imageSeqView" เป็นฟังก์ชัน powershell วิธีที่ 1 ไม่จำเป็นอย่างสมบูรณ์และลดประสิทธิภาพลงเล็กน้อย

สำหรับตัวเลือกหน้าต่างคำสั่งมีตัวเลือกที่คล้ายกันใน powershell เช่น -NoExit ซึ่งควรจะเหมือนกับ / K ใน cmd

สำหรับท่อซับเริ่มต้น env vars, powershell สามารถทำได้อย่างเท่าเทียมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.