Windows Command Prompt ค้นหาตำแหน่งอื่นที่ไม่ใช่ตำแหน่งที่ระบุโดยตัวแปร PATH เมื่อเรียกใช้แอปพลิเคชันโปรแกรมหรือไม่


35

ฉันลองการทดลองต่อไปนี้

ก่อนที่ฉันจะเริ่มฉันตรวจสอบตัวแปร PATH จาก cmd ซึ่งมีค่าดังต่อไปนี้:

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

ตอนแรกฉันคิดว่า cmd มองหา executables ในไดเรกทอรีที่มีอยู่ในตัวแปร PATH ดังนั้นฉันจึงสุ่มเลือกแอปพลิเคชั่น - winword.exe (Microsoft Word) และพยายามที่จะเปิดมันจากบรรทัดคำสั่ง:

start winword

แต่ด้วยความประหลาดใจของฉันโปรแกรมเปิดตัว! เหตุผลที่ฉันแปลกใจก็เพราะฉันค้นหาไดเรกทอรีทั้งหมดในตัวแปร PATH สำหรับไฟล์ exe ที่เรียกว่า 'winword' แต่การค้นหาทั้งหมดของฉันว่างเปล่า!

ฉันได้ข้อสรุปว่าพรอมต์คำสั่งต้องรู้จักการค้นหาในตำแหน่งอื่นนอกเหนือจากที่ระบุไว้ในตัวแปร PATH เพื่อค้นหาไฟล์ปฏิบัติการ

เห็นได้ชัดว่าสิ่งต่อไปที่ฉันทำคือมองหาตำแหน่งที่แน่นอนที่ไฟล์ปฏิบัติการ 'winword' ตั้งอยู่ ปรากฎว่า winword.exe ตั้งอยู่ที่นี่:

C:\Program Files\Microsoft Office 15\root\office15

ดังนั้นให้ฉันคิดว่าบางที CMD จะดูโดยอัตโนมัติผ่าน ProgramFiles และ ProgramFiles (x86) (และไดเรกทอรีย่อยทั้งหมด) เมื่อดำเนินการคำสั่ง 'เริ่ม'? ซึ่งทำให้ฉันพยายามเปิดแอปพลิเคชันอื่นที่ติดตั้งบนคอมพิวเตอร์ของฉัน Audacity โดยมีไฟล์ exe อยู่ที่:

C:\Program Files (x86)\Audacity

ความประหลาดใจของฉันอีกครั้งความกล้าไม่สามารถเริ่มต้นได้เมื่อฉันพิมพ์:

start audacity

ที่บรรทัดคำสั่ง

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

ฉันได้เพิ่มไดเรกทอรีที่มี audacity.exe ไปที่ PATH:

set path=%path%;C:\Program Files (x86)\Audacity

หลังจากนั้นฉันลองเรียกใช้ความกล้าอีกครั้ง:

start audacity

ไม่น่าประหลาดใจที่ Audacity เปิดตัว

สิ่งที่ฉันต้องการทราบว่าพรอมต์คำสั่งค้นหาที่ปฏิบัติการได้หรือไม่ เหตุใด winword.exe จึงเปิดตัวแม้ว่าไดเรกทอรีที่มีอยู่นั้นจะไม่ได้เป็นส่วนหนึ่งของ PATH แต่สิ่งเดียวกันนี้ไม่เป็นความจริงสำหรับ audacity.exe

ฉันลองแอปพลิเคชันอื่นด้วย Chrome และ Firefox ทำงานได้เมื่อฉันใช้คำสั่งเริ่มต้น

UPDATE:ฉันใช้ Windows เวอร์ชั่น 6.3.9600 (Windows 8.1)


คำตอบ:


44

ตอนแรกฉันคิดว่า cmd มองหา executables ในไดเรกทอรีที่มีอยู่ในตัวแปร PATH ดังนั้นฉันสุ่มเลือกแอปพลิเคชั่น - winword.exe (Microsoft Word) และพยายามที่จะเปิดมันจากบรรทัดคำสั่ง:

เหตุผลwinword.exeก็คือมีรีจิสตรีคีย์อยู่ซึ่งกำหนดพา ธ ไปยัง Microsoft Word (Winword.exe) มีคีย์ที่คล้ายกันสำหรับ Firefox.exe และ Chrome.exe หากมีการติดตั้งแอปพลิเคชันเหล่านั้น

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

สิ่งที่ฉันต้องการทราบว่าพรอมต์คำสั่งค้นหาที่ปฏิบัติการได้หรือไม่

..\App Pathsตัวแปรระบบเส้นทางเส้นทางของผู้ใช้ตัวแปรและปุ่มต่างๆที่อยู่ภายใน ฉันสามารถยืนยันได้ว่าความกล้านั้นไม่ได้สร้างกุญแจสำหรับตัวเองเมื่อติดตั้ง

เมื่อเรียกใช้ฟังก์ชัน ShellExecuteEx ด้วยชื่อของไฟล์ที่เรียกใช้งานได้ในพารามิเตอร์ lpFile มีหลายตำแหน่งที่ฟังก์ชันค้นหาไฟล์ เราขอแนะนำให้ลงทะเบียนแอปพลิเคชันของคุณในคีย์ย่อยของรีจิสทรี App Paths การทำเช่นนี้หลีกเลี่ยงความต้องการแอปพลิเคชันในการปรับเปลี่ยนตัวแปรสภาพแวดล้อมของระบบ PATH

  • ไดเรกทอรีการทำงานปัจจุบัน
  • ไดเรกทอรี Windows เท่านั้น (ไม่มีการค้นหาไดเรกทอรีย่อย)
  • ไดเรกทอรี Windows \ System32
  • ไดเร็กทอรีที่แสดงรายการในตัวแปรสภาพแวดล้อม PATH
  • แนะนำ: เส้นทางของ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App

ที่มา: การลงทะเบียนแอปพลิเคชัน


15

จากพรอมต์คำสั่งถ้าคุณเพียงแค่ป้อนWinWordมันล้มเหลวในการทำงาน

ถ้าคุณใส่START WinWordมันทำงาน

Startคำสั่งเป็นกุญแจสำคัญที่นี่

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

  • ไดเรกทอรีการทำงานปัจจุบัน

  • Windowsไดเรกทอรีเท่านั้น (ไม่มีไดเรกทอรีที่จะค้นหา)

  • Windows\System32ไดเรกทอรี

  • ไดเร็กทอรีที่แสดงรายการในPATHตัวแปรสภาวะแวดล้อม

  • แนะนำ:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWordอยู่ในรีจิสตรีคีย์ กุญแจอยู่ตรงนั้นเพื่อไม่ให้PATHยาวเกินไป


7
กรุณาอ้างอิงและอ้างถึงแหล่งที่มาทั้งหมด หากคุณไม่ได้เขียนคำสั่งค้นหาจากหน่วยความจำคุณควรอ้างถึงแหล่งที่มาของคุณซึ่งระบุรายการและลำดับการค้นหา
Ramhound

แหล่งที่มาจะเป็นบันทึกของฉันจากสิ่งที่ฉันทำงานในสองสามปีที่ผ่านมา ฉันไม่รู้ว่าฉันหยิบมันขึ้นมาได้ที่ไหนหน้าเว็บต่างๆมาแล้วไป
Larryc

5
คุณได้มาจากเอกสารชุดเดียวกันทุกคนได้จากพวกเขา
Ramhound

7

โปรแกรม (เมื่อคุณระบุชื่อโมดูลโดยไม่มีไดรฟ์ / เส้นทางในพรอมต์คำสั่ง) ในตัวประมวลผลคำสั่งของ Windows (CMD.EXE) สามารถเริ่มต้นได้เมื่อพบ:

  • โดยตัวแปรสภาพแวดล้อมของ PATH (ทั้งที่ทำงานได้และ hardlink / softlink / ทางลัดที่มีชื่อเดียวกัน)

  • โดย DOSKEY alias

  • โดยแอปพลิเคชันเส้นทางจากHKLM\Software\Microsoft\Windows\CurrentVersion\App PathsหรือHKCU\Software\Microsoft\Windows\CurrentVersion\App Paths(เมื่อใช้startคำสั่ง)

การใช้ความรู้นี้ (โดยเฉพาะอย่างยิ่งที่ผ่านมา) คุณสามารถสร้างนามแฝงของคุณเองเพื่อความสะดวกของคุณ ตัวอย่างเช่นคุณสามารถสร้างHKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exeด้วยค่าเริ่มต้นC:\Program Files (x86)\Audacity\Audacity.exeและเริ่มต้นแอปพลิเคชันนี้เพียงแค่พิมพ์start auพรอมต์คำสั่ง


0

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

exeคุณโดยเฉพาะบอกว่าคุณกำลังค้นหาไฟล์ที่มีนามสกุล Windows จะพยายามเรียกใช้ไฟล์ของส่วนขยายอื่น ๆ

ตัวแปรสภาพแวดล้อมอื่น ๆ PATHEXTที่เข้ามาในเล่นเมื่อรันคำสั่งเป็นตัวแปร นี่เป็น;รายการส่วนขยายไฟล์ที่ถูกคั่นเพื่อพยายามดำเนินการ หากคุณสะท้อนPATHEXTคุณอาจเห็นบางสิ่งเช่น.COM;.EXE;.BAT;.CMD;.VBS;... (ฯลฯ ) บางแอปพลิเคชันใช้ไฟล์ประเภทอื่น ๆ เหล่านี้เป็นจุดเข้าใช้งานของผู้ใช้ปลายทาง มันเป็นเรื่องธรรมดาน้อยกว่ามาก แต่มันเกิดขึ้น ฉันใช้ผลิตภัณฑ์เชิงพาณิชย์ที่สำคัญหลายอย่างซึ่งเริ่มต้นจาก.BATสคริปต์ ที่จะใช้หนึ่งของพวกเขาเป็นตัวอย่างที่ผมสามารถเริ่มต้นด้วยคำสั่งstandaloneแม้ว่าจะไม่มีstandalone.exe... standalone.batแทนก็มี

ส่วนขยายบางอย่างที่ฉันมีในตัวPATHEXTฉันกำลังดูอยู่ตอนนี้ฉันไม่เคยใช้แอปพลิเคชันเลย คนที่ฉันได้วิ่งเข้ามามากขึ้นทั่วไป ( แต่เห็นได้ชัดว่าไม่มากเท่าexe) .comมีดังนี้: .bat, .vbs, .js, .jar, สองรายการแรกคือไฟล์สคริปต์ของ windows batch และอีกสามชนิดเป็นชนิดไฟล์สำหรับภาษาการเขียนโปรแกรมเฉพาะซึ่งเรียกใช้จากสคริปต์หรือเครื่องเสมือนแทนจากexes (ตามลำดับ: visual Basic, javascript และ java)


ผู้ลงคะแนนเสียงให้ความสนใจ (ฉันรู้ว่าปกติแล้วมันไร้ประโยชน์ที่จะถาม แต่บางครั้งฉันก็ได้รับคำตอบ) ฉันทำผิดพลาดที่ไหนสักแห่งหรือไม่?
Loduwijk

ไม่ใช่ฉัน แต่ด้วยการคาดเดาที่ดุเดือดนั่นเป็นเพราะในขณะที่PATHEXTและPATHทั้งสองเกี่ยวข้องกับการทำให้สิ่งต่าง ๆ ทำงานพวกเขาค่อนข้างตั้งฉากกับงานที่เกี่ยวข้อง PATHระบุตำแหน่งที่จะมองหาสิ่งที่จะเรียกใช้และเป็นสิ่งที่ OP ขอมาในขณะที่PATHEXTระบุสิ่งที่สามารถเรียกใช้ได้
dgnuff

@duffuff สิ่งที่น่าสนใจเนื่องจากเป็นประเด็นของฉัน: OP ได้เขียนเฉพาะคำถามในลักษณะที่ขอร้องให้ท้าทายกรอบ ... ในแง่ของ SE พวกเขาถาม "คำถาม XY" ด้วยการสันนิษฐานว่าไฟล์ที่ถูกเรียกใช้ไม่ใช่ ในสถานที่ที่มีการค้นหาบนเส้นทางแล้ว อย่างไรก็ตามขอบคุณ
Loduwijk

0

start winwordwinwordไม่ได้บอกพร้อมรับคำสั่งในการเปิดตัว มันบอกว่าพร้อมรับคำสั่งที่จะเปิดตัวพร้อมกับการโต้แย้ง start ใช้วิธีการของตัวเองที่จะหา winwordStartwinword

เพียงแค่บอกพร้อมรับคำสั่งในการเปิดตัวwinword winwordและถ้าคุณลองทำเช่นนั้นเนื่องจากwinwordไม่ได้อยู่ในPATHนั้นก็จะไม่เปิดตัว

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