มีปัญหาในการรันไฟล์ cmd หรือแบตช์จาก c #

ฉันต้องเรียกใช้แบตช์ไฟล์ (หรือ cmd) จาก c# รหัสของฉันง่ายขนาดนี้:

 Process.Start(@"C:\b.bat");
Process.Start(@"cmd.exe");

ฉันได้ลอง การเรียกใช้งาน Batch File ใน C# และไซต์อื่น ๆ อีกมากมาย แต่ฉัน อย่าคิดว่าปัญหาเกี่ยวข้องกับไวยากรณ์

เกิดข้อผิดพลาดกับบรรทัดใดบรรทัดหนึ่งด้านบน ซึ่งฉันได้ค้นหาใน Google แล้ว แต่ไม่พบวิธีแก้ไขปัญหาสำหรับปัญหาเฉพาะของฉัน:

เกิดข้อยกเว้นที่ไม่สามารถจัดการได้ประเภท 'System.ComponentModel.Win32Exception' เกิดขึ้นใน System.dll ข้อมูลเพิ่มเติม: ไฟล์ปฏิบัติการที่ระบุไม่ใช่แอปพลิเคชันที่ถูกต้องสำหรับแพลตฟอร์มระบบปฏิบัติการนี้

สิ่งที่แปลกคือรหัสเหล่านี้จะทำงานได้โดยไม่มีปัญหา:

Process.Start(@"IExplore.exe");
Process.Start("notepad");

ฉันใช้ Visual Studio 2012 และคอมไพล์สำหรับ x86 แต่ระบบปฏิบัติการของฉันคือ Windows 7 64 บิต ไม่แน่ใจว่าสำคัญหรือไม่ ทุกอย่างในโปรแกรมทำงานได้ดี

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!


person 1ak31sha    schedule 07.06.2013    source แหล่งที่มา


คำตอบ (3)


ฉันคิดว่าปัญหาของคุณคือคุณกำลังพยายามเริ่มกระบวนการที่ไม่รู้จักใน Process.Start(@"C:\b.bat") เมื่อฉันทำสิ่งนี้ฉันใช้สิ่งต่อไปนี้

        string cmd = "/C b.bat";
        var m_command = new System.Diagnostics.Process();
        m_command.StartInfo.FileName = @"cmd.exe";
        m_command.StartInfo.Arguments = cmd;
        m_command.Start();

/C จะปิด applciation หลังจากเสร็จสิ้น ดังนั้นโดยพื้นฐานแล้วโค้ดด้านบนจะ:

  1. เริ่มกระบวนการ cmd.exe
  2. ดำเนินการข้อโต้แย้งของคุณ (ในกรณีนี้ /C b.bat)
  3. คุณสามารถเพิ่ม m_command.WaitForExit() ได้หากต้องการให้โปรแกรมรอ b.bat เพื่อดำเนินการให้เสร็จสิ้นก่อนดำเนินการต่อ
person Evan L    schedule 07.06.2013
comment
ขอบคุณที่ตอบกลับ!! ฉันรันโค้ดของคุณแล้ว แต่มันก็ใช้งานไม่ได้ โปรดทราบด้วยว่าฉันไม่ต้องการเรียกใช้ cmd และค้างคาว จากสิ่งที่ฉันอ่านมา ฉันควรจะสามารถรันค้างคาวได้ง่ายๆ - person 1ak31sha; 08.06.2013
comment
ไม่มีปัญหา มันได้ผลไหม? หากเป็นเช่นนั้น โปรดทำเครื่องหมายว่าเป็นคำตอบโดยคลิกเครื่องหมายถูกด้านล่างปุ่มโหวตขึ้น/ลง - person Evan L; 08.06.2013
comment
ในกรณีนี้ ดูเหมือนว่าไฟล์แบตช์ที่คุณพยายามเรียกใช้ไม่ถูกต้อง บางทีอาจโพสต์บรรทัดใหม่ในไฟล์ Batch อีกครั้ง จะเกิดอะไรขึ้นหากคุณเรียกใช้แบตช์ไฟล์โดยตรงจากบรรทัดคำสั่ง มันดำเนินการหรือไม่? มันทำให้คุณเกิดข้อผิดพลาดเดียวกันหรือไม่? - person Evan L; 08.06.2013
comment
WaitForExit() จะมีประโยชน์อย่างแน่นอน... แต่ก็ยังมีข้อผิดพลาดเดิมอยู่ - person 1ak31sha; 08.06.2013
comment
ไฟล์แบตช์ควรจะไม่เป็นไร ฉันสามารถคลิกมันได้และมันก็ทำในสิ่งที่ฉันต้องการ ฉันไม่สามารถเปิด cmd ว่างๆ ได้...ฉันคิดว่าถ้าเราแก้ไขปัญหานั้น แบตช์ก็จะทำงานได้ดีเช่นกัน - person 1ak31sha; 08.06.2013
comment
โอเค ฉันค่อนข้างแน่ใจว่าเป็นเพราะคุณกำลังรันมันในโหมด 32 บิตบนเครื่อง 64 บิต ไม่ใช่ความเชี่ยวชาญของฉัน แต่อาจพยายามจำกัดขอบเขตให้แคบลงด้วยการรวบรวม 64 บิต หากได้ผลก็เกี่ยวข้องกับแพลตฟอร์ม ตรวจสอบให้แน่ใจว่าการตั้งค่าแพลตฟอร์มของคุณถูกต้องในตัวจัดการการกำหนดค่า เช่น. ตั้งค่าเป็น x86 แทนที่จะเป็นพีซีใดๆ - person Evan L; 08.06.2013
comment
ลองดู โพสต์นี้ เกี่ยวข้องกัน - person Evan L; 08.06.2013
comment
ฉันต้องคอมไพล์ x86 เนื่องจากแอพนี้มีไว้สำหรับคอมพิวเตอร์เครื่องอื่นที่เป็น x86 และฉันก็เรียกใช้คำสั่ง SQL และไดรเวอร์ก็ขึ้นอยู่กับ x86 นี่คือบางสิ่งที่ทำให้ฉันคลั่งไคล้ - ฉันค่อนข้างแน่ใจว่าฉันรันคำสั่งเมื่อเช้านี้และมันก็ใช้ได้ดี...จะต้องมีวิธีเปิด cmd... - person 1ak31sha; 08.06.2013
comment
ตกลง ดังนั้นฉันจึงคอมไพล์ใน x64 และเปิด cmd ฉันต้องการ x86 ฉันไม่แน่ใจว่าต้องทำอะไรใน ATM ฉันกำลังค้นหาวิธีเรียกใช้ x86 cmd... - person 1ak31sha; 08.06.2013
comment
หากคุณรันโปรแกรมจากเครื่อง 32 บิต (รุ่น release) โปรแกรมจะทำงานกับรุ่น x86 ดังนั้น หากไม่มีผู้ใช้คนใดใช้งานจากเครื่อง 64 บิต ก็ไม่ต้องกังวล และสร้างเป็น x86 - person Evan L; 08.06.2013
comment
ฉันพยายามตั้งค่าคุณสมบัติไฟล์แบตช์เป็นโหมดที่เข้ากันได้สำหรับ windows 98 แต่มันไม่ทำงาน จะมีผู้ใช้ 64 บิตอยู่บ้าง (รวมถึงตัวฉันเองด้วย - มันจะยากที่จะสร้างแอปของฉันโดยไม่สามารถทดสอบได้...) - person 1ak31sha; 08.06.2013
comment
ฉันจะใช้สคริปต์ Perl เพื่อรันแบตช์ - ดูเหมือนว่าจะแก้ไขปัญหานี้ได้ ขอบคุณมากที่ช่วยฉัน! คุณแยกปัญหาออก :) - person 1ak31sha; 08.06.2013
comment
@ user2464951: คุณลองเปิด C:\Windows\SysWOW64\cmd.exe ด้วยตนเองได้ไหม นั่นคือ cmd.exe 32 บิตซึ่งเป็นตัวที่แอปพลิเคชัน 32 บิตบน x64 จะทำงาน ดูเหมือนว่าไฟล์นั้นอาจเสียหายในระบบของคุณ หรืออาจเป็นไปได้ว่าพบไฟล์อื่นชื่อ cmd.exe ก่อนไฟล์จริงใน PATH สำหรับแอปพลิเคชัน 32 บิต และไฟล์นั้นเสียหาย - person Sven; 08.06.2013

Process.Start(@"C:\b.bat"); ควรจะใช้งานได้ แต่การใส่มันลงในรูทอาจทำให้เกิดปัญหาได้ ลองย้ายไฟล์ bat ไปยังไดเร็กทอรีโปรเจ็กต์ของคุณ และใส่พาธสัมบูรณ์ไปยังไฟล์ ตัวอย่างเช่น ฉันเพิ่งประสบความสำเร็จกับ Process.Start(@"""C:\dev\ConsoleApplication1\ConsoleApplication1\test.bat""");

person sfuqua    schedule 08.06.2013

ฉันแก้ไขปัญหาด้วยการรัน 32 บิต cmd ด้วยคำสั่งนี้:

proc.StartInfo.FileName = @"C:\windows\system32\cmd.exe";

person 1ak31sha    schedule 12.06.2013