การเรียกใช้ไฟล์ EXE โดยใช้สคริปต์ PowerShell


112

ฉันพยายามเรียกใช้ไฟล์ EXE โดยใช้สคริปต์ PowerShell หากฉันใช้บรรทัดคำสั่งมันจะทำงานได้โดยไม่มีปัญหา (ก่อนอื่นฉันระบุชื่อของไฟล์ปฏิบัติการและชุดของพารามิเตอร์ที่จะเรียกใช้):

"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

แต่การทำสิ่งเดียวกันภายในสคริปต์จะส่งกลับข้อผิดพลาด:

คำว่า '"C: \ Program Files \ Automated QA \ TestExecute 8 \ Bin \ TestExecute.exe" C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode' ไม่รู้จักเป็นชื่อของ cmdlet ฟังก์ชัน ไฟล์สคริปต์หรือโปรแกรมที่ใช้งานได้ ตรวจสอบการสะกดชื่อหรือถ้ามีพา ธ ตรวจสอบว่าพา ธ ถูกต้องแล้วลองอีกครั้ง

(ฉันเรียกใช้คำสั่งโดยใช้โอเปอเรเตอร์ "&")

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


4
กรุณาโพสต์รหัสของคุณ เนื่องจากนั่นคือจุดที่เป็นปัญหาการมองดูจึงง่ายกว่าการคาดเดา
โคดี้เกรย์

คำตอบ:


124
& "C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

หรือ

[System.Diagnostics.Process]::Start("C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe", "C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode")

อัปเดต: ขออภัยฉันพลาด "(ฉันเรียกคำสั่งโดยใช้ประโยค" & ") ฉันมีปัญหานี้เมื่อฉันกำลังประเมินเส้นทางแบบไดนามิก ลองใช้โครงสร้าง Invoke-Expression:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"

แปลกที่คำสั่งในคำถามเดิมเกือบจะใช้ได้กับฉันบน VM ใน PS2.0 แต่ตอนนี้คำสั่งเดียวกันนั้นล้มเหลวในระบบ PS4.0 น่าสนใจพอฉันเรียก TestExecute ด้วย ฉันคิดว่าฉันชอบตัวเลือกที่ 2 ที่สุดฉันจะยิงให้ขอบคุณ!
EJA

33

ดูเหมือนว่าคุณกำลังระบุทั้ง EXE และอาร์กิวเมนต์แรกในสตริงเดียวเช่น; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. วิธีนี้ใช้ไม่ได้ โดยทั่วไปคุณจะเรียกใช้คำสั่งเนทีฟที่มีช่องว่างในพา ธ ดังนี้:

& "c:\some path with spaces\foo.exe" <arguments go here>

ที่&คาดว่าจะตามด้วยสตริงที่ระบุคำสั่ง: cmdlet, function, native exe สัมพัทธ์หรือพา ธ สัมบูรณ์

เมื่อคุณได้ผลเพียงแค่นี้:

& "c:\some path with spaces\foo.exe"

เริ่มดำเนินการกับการอ้างอิงข้อโต้แย้งตามความจำเป็น แม้ว่าดูเหมือนว่าอาร์กิวเมนต์ของคุณควรจะใช้ได้ดี (ไม่มีช่องว่างไม่มีอักขระพิเศษอื่น ๆ ที่ตีความโดย PowerShell)


2
จะมีการเรียกใช้สคริปต์ powershell โดยไม่มีเส้นทางแบบเต็มหรือไม่หากสคริปต์และ exe อยู่ในโฟลเดอร์เดียวกัน หรือเป็นไปได้ที่จะใช้เส้นทางสัมพัทธ์?
guanome

7
หาก exe ที่อยู่ในโฟลเดอร์เดียวกันแล้วคุณสามารถทำเช่นนี้.\foo.exeและคุณยังสามารถใช้เส้นทางญาติและทางญาติที่มีช่องว่าง..\..\foo.exe & '..\..\path with spaces\foo.exe'
Keith Hill

เมื่อคุณมีไพพ์ในคำสั่งของคุณมากกว่าที่คุณควรใช้เครื่องหมายคำพูด: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee

2

ใน Powershell ให้ cd ไปยังตำแหน่งไฟล์. exe ตัวอย่างเช่น:

ซีดี C: \ Users \ Administrators \ Downloads

PS C: \ Users \ Administrators \ Downloads> & '. \ aaa.exe'

ตัวติดตั้งจะปรากฏขึ้นและปฏิบัติตามคำแนะนำบนหน้าจอ


สิ่งที่ฉันต้องการ! เรียกใช้ไฟล์. exe & '. \ aaa.exe'
Sharif Yazdian

2
  1. โคลน $ args
  2. ผลักดัน args ของคุณในอาร์เรย์ใหม่
  3. & $ path $ args

การสาธิต:

$exePath = $env:NGINX_HOME + '/nginx.exe'
$myArgs = $args.Clone()

$myArgs += '-p'
$myArgs += $env:NGINX_HOME

& $exepath $myArgs

Thx @nodoccat ทำงานได้อย่างมีเสน่ห์ในการเปิดใช้งานคำสั่งนักเทียบท่าพร้อมรายการอาร์กิวเมนต์ที่ยาวมาก
danidemi

1

ไม่ใช่นักพัฒนาฉันพบวิธีแก้ปัญหาในการเรียกใช้คำสั่ง ps หลายคำสั่งในบรรทัดเดียว เช่น:

powershell "& 'c:\path with spaces\to\executable.exe' -arguments ; second command ; etc

โดยการใส่เครื่องหมาย "(เครื่องหมายคำพูดคู่) ไว้หน้าเครื่องหมาย & (เครื่องหมายและ) มันจะเรียกใช้งานไฟล์ปฏิบัติการไม่มีตัวอย่างใดที่ฉันพบว่ามีการกล่าวถึงสิ่งนี้หากไม่มีเครื่องหมายคำพูดคู่พรอมต์ ps จะเปิดขึ้นและรอการป้อนข้อมูล


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