วิธีเรียกใช้แบตช์ไฟล์โดยไม่เรียกใช้“ หน้าต่างคำสั่ง” [ซ้ำ]


131

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

ใน Windows XP ฉันสามารถเรียกใช้ไฟล์ batch (.bat หรือ. cmd) ผ่านทางลัดโดยไม่มี "หน้าต่างดำ" ได้หรือไม่


6
คุณกำลังถามว่าคุณสามารถป้องกันไม่ให้หน้าต่างคำสั่งปรากฏขึ้นเมื่อคุณเรียกใช้ไฟล์ค้างคาวหรือไม่?
Eric

6
ใช่คุณสามารถเปลี่ยนสีเริ่มต้นของหน้าต่างผลลัพธ์ได้อย่างง่ายดายโดยใช้คุณสมบัติบนทางลัด cmd.exe (ใช่นี่เป็นเรื่องตลก ... )
Toby J

คำตอบ:


86

บันทึกข้อมูลต่อไปนี้เป็น wscript เช่น hidecmd.vbs หลังจากแทนที่ "test.bat" ด้วยชื่อไฟล์แบตช์ของคุณ

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

พารามิเตอร์ที่สองของoShell.Runis คือintWindowStyleค่าที่ระบุลักษณะที่ปรากฏของหน้าต่างของโปรแกรมและค่าศูนย์สำหรับหน้าต่างที่ซ่อนอยู่

การอ้างอิงอยู่ที่นี่http://msdn.microsoft.com/en-us/library/d5fk67ky.aspx


บรรทัดที่สามจะเป็น: strArgs = "cmd / c FILEPATH \ testing.bat" หรือไม่
Dan Z

1
มีวิธีใดที่จะรันค้างคาวในโหมดยกระดับในขณะที่ยังคงมองไม่เห็นอยู่หรือไม่?
Laurens Swart

วิธีการเรียกใช้.batไฟล์ในฐานะผู้ดูแลระบบโดยใช้วิธีนี้?
Mehdi Dehghani

44

นี่เป็นเพียงคำตอบง่ายๆของ Shaji คุณสามารถเรียกใช้สคริปต์ชุดงานของคุณผ่านสคริปต์VBScript (.vbs) ดังนี้:

'HideBat.vbs
CreateObject("Wscript.Shell").Run "your_batch_file.bat", 0, True

สิ่งนี้จะดำเนินการไฟล์แบตช์ของคุณโดยไม่มีหน้าต่างคำสั่งปรากฏขึ้น


จะเรียกใช้.batไฟล์ในฐานะผู้ดูแลระบบโดยใช้วิธีนี้ได้อย่างไร
Mehdi Dehghani

@MehdiDehghani Properties> ความปลอดภัย> เรียกใช้ในฐานะผู้ดูแลระบบ หากใช้งานได้กับ exe หรือแอพเท่านั้น
เทย์เลอร์สปาร์ค

21

เพียงเพื่อขยายคำตอบ "ใช้ Windows Scripting" (ซึ่งฉันคิดว่าดีที่สุดเพราะมีอยู่แล้วในตัว) นี่คือวิธีการทำโดยใช้สคริปต์ wrapper เดียวและส่งชื่อไฟล์แบทช์ "ของจริง" เป็นพารามิเตอร์ พารามิเตอร์เพิ่มเติมจะถูกส่งต่อไปยังไฟล์แบตช์

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next

    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

ดังนั้นเช่นบันทึกไฟล์ข้างต้นเป็นNoShell.vbsบางที่แล้วโทร:

NoShell.vbs c:\foo\my_batch_file.bat

สุดท้ายหากคุณต้องการเรียกใช้จากที่ใดที่ไม่เข้าใจไฟล์. vbs (เช่น "เครื่องมือภายนอก" ใน Visual Studio) คุณจะต้องโทรหาC:\Windows\System32\wscript.exeด้วยไฟล์ vbs เป็นพารามิเตอร์ตัวแรกและ ไฟล์แบทช์เป็นครั้งที่สอง


6
สำหรับผู้ที่ไม่ชอบความคิด & แนวคิดในการสร้างไฟล์ vbs ใหม่สำหรับไฟล์ bat ใหม่ทุกไฟล์ที่สร้างขึ้นหนึ่งต้องใช้หนึ่งในสองคำตอบด้านบนนี่เป็นโซลูชั่นที่สมบูรณ์แบบ แทนที่จะเป็นไฟล์ vbs หลายไฟล์คุณจะมีทางลัดหลายทาง สำหรับไฟล์ bat ใหม่ทุกไฟล์ให้สร้างทางลัดของไฟล์ vbs คลิกขวาที่มันเลือกคุณสมบัติ> แท็บทางลัด & ในกล่องเป้าหมายให้ป้อนเส้นทางของไฟล์ค้างคาวหลังจากเส้นทางที่มีอยู่แล้วตามที่แสดงไว้ด้านบนหรือชอบ นี้ถ้าทางลัดไม่ได้อยู่ในสถานที่เดียวกันกับไฟล์ vbs "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.batนี้:
Rolo

หากเส้นทางไฟล์ของไฟล์ bat มีช่องว่างจะสามารถเรียกใช้วิธีลัดไปยังไฟล์ vbs ได้อย่างไร ตัวอย่างเช่น"C:\My Files\HideCmd.vbs" c:\my things\my_batch_file.bat. ไม่ว่าฉันจะลองใช้เส้นทางแบบไหน - ให้ใส่เครื่องหมายอัญประกาศล้อมรอบทุกอย่าง% 20 แทนที่พื้นที่หรือการรวมกันของสองสิ่งนี้ไม่มีอะไรทำงาน ฉันได้รับข้อความแสดงข้อผิดพลาดบอกฉันว่าไม่พบไฟล์หรือไม่มีอะไรเกิดขึ้น นี่เป็นเพราะข้อผิดพลาดของผู้ใช้ในตอนท้ายของฉันข้อ จำกัด ของ Windows ที่มีฟิลด์เป้าหมายสำหรับทางลัดหรือปัญหากับสคริปต์ vbs ที่มันไม่ได้จัดการเส้นทางของไฟล์ที่มีช่องว่างอย่างเหมาะสมหรือไม่?
Rolo

@Rolo ฉันได้อัปเดตสคริปต์เพื่อที่ว่าหากพารามิเตอร์ใด ๆ ที่เข้ามามีช่องว่างมันจะล้อมรอบพวกเขาด้วยคำพูด ดังนั้นคุณจะต้องการตัดพา ธ ไปยังไฟล์แบตช์ด้วยอัญประกาศเมื่อทำการเรียกมันจากนั้นจะถือว่าเป็นอาร์กิวเมนต์เดี่ยวและตัดคำใหม่ก่อนที่จะถูกเรียก
Toby J

9

คุณสามารถเปลี่ยนคุณสมบัติของทางลัดเพื่อให้ย่อขนาดได้

หากต้องการเรียกใช้อย่างล่องหนอย่างสมบูรณ์คุณจะต้องมีอย่างอื่นเช่น Windows Scripting


1
คำแนะนำแรกของคุณคือวิธีที่ฉันทำมันมาตลอด
martineau

8

ใช้เริ่มต้นด้วยตัวเลือก '/ B' ตัวอย่างเช่น:

@echo off
start /B go.bat

25
start /bจะเรียกใช้โปรแกรมในคอนโซลที่จัดสรรไว้ในปัจจุบันแทนที่จะวางไข่ใหม่ คุณจะได้รับชุดใหม่ตั้งแต่ชุดต้องทำงานด้วย cmd (ซึ่งในที่สุด [แปลกใจ] จะเปิดคอนโซล)
Joey

@ โจอี้ใช่ แต่สิ่งนี้มีประโยชน์มากสำหรับการเปิดไฟล์แบตช์จากแอปพลิเคชันอื่นผ่านการใช้เชลล์ (เช่นSYSTEMใน C / C ++)
Tomáš Zato

1
@ TomášZato: คุณเพียงแค่สามารถเรียกไฟล์ batch cmd /c foo.cmdโดยตรงในกรณีที่ว่าหรือหากสิ่งที่คุณใช้ในการวางไข่กระบวนการที่ไม่สร้างเปลือกแรกที่ใช้ มีอย่างไม่จำเป็นต้องใช้startในสถานการณ์เหล่านั้นและผมยืนยันว่าไม่ควรนำมาใช้ในความโปรดปรานของsystem CreateProcessเมื่อเปิดไฟล์แบตช์คุณจะต้องพึ่งพาแพลตฟอร์มเดียวอยู่แล้วและคุณอาจใช้เครื่องมือที่ดีกว่าสำหรับงาน
Joey

@ Joey ขอบคุณพวงไม่เคยได้ยินมาcmd /cก่อน คำสั่ง cmd คือสิ่งที่ฉันต้องการในกรณีของฉัน แต่คำตอบ stackexchange ทั้งหมดที่ฉันพบจนถึงตอนนี้เกี่ยวกับแบตช์ไฟล์ที่เรียกใช้ไฟล์แบตช์อื่นมีคำตอบที่ดีที่สุดสำหรับการใช้งานเริ่มต้น ...
T_D

start /b go.bat จะไม่จัดสรรคอนโซลใหม่ (เช่นอินสแตนซ์ของ conhost.exe - หรือเธรดใน csrss.exe ก่อน Windows 7) แต่มันจะทำให้เป็นระเบียบตั้งแต่สคริปต์ชุดจะทำงานกับตัวอย่างใหม่ของ cmd.exe ที่ติดอยู่กับคอนโซลเดียวกัน ทั้งสองอินสแตนซ์ของเชลล์จะแข่งขันเพื่ออ่านอินพุตจากคอนโซลโดยทั่วไปแล้วจะสลับกัน มันต้อง/w(เช่นstart /b /w go.bat) เพื่อที่จะรอในครั้งที่สองซึ่งเป็นคล้ายกับการใช้ถ้าใช้cmd /c systemนอกจากนี้หากคุณโทรให้เรียกCreateProcessใช้go.batโดยตรง cmd /cไม่จำเป็นต้องเป็น
Eryk Sun

6

ฟรี GPL โอเพนซอร์ส "สร้างกระบวนการที่ซ่อนอยู่"

http://www.commandline.co.uk/chp/

Microsoft Security Essentials และอาจเป็นสแกนเนอร์ไวรัส / มัลแวร์อื่น ๆ ส่วนใหญ่จะจัดการ chp.exe ที่ปฏิบัติการได้เนื่องจากเป็นไวรัสเพราะจะซ่อนโปรแกรมอะไรก็ตามที่คุณระบุไม่ให้แสดงหน้าต่างหรือปุ่มแถบงานเหมือนกับที่ไวรัสทำ

มันไม่ใช่ไวรัส ไม่ซ่อนกระบวนการเป้าหมายไม่ให้ปรากฏในตัวจัดการงานตัวอย่างเช่น และแน่นอนว่ามีซอร์สโค้ดรวมอยู่ด้วยดังนั้นคุณจะเห็นว่ามันมีขนาดเล็กมากและไม่ได้ทำอะไรเลยนอกจากรันโปรแกรมใด ๆ ก็ตามที่คุณให้มา

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


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


6

คุณสามารถใช้สคริปต์หน้าต่างเช่นAutoIt

เป็นตัวอย่างเพียงแค่เขียนสิ่งนี้กับโปรแกรมแก้ไขสคริปต์ AutoIt มันค่อนข้างง่าย

Run("C:\test\batchfile.bat", "", @SW_HIDE)

หากคุณต้องการเรียกใช้ในการวนซ้ำ

$x=0
Do
 Run("C:\test\batchfile.bat", "", @SW_HIDE)
 Sleep(5000)
Until $x = 1

รวบรวมเป็น. exe - และคุณทำเสร็จแล้ว


เช่นเดียวกันในAutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 

5

ใช้การเริ่มต้นที่ซ่อน (ราคา $ 20)

เริ่มต้นที่ซ่อน - เรียกใช้แอปพลิเคชันและแบตช์ไฟล์โดยไม่มีหน้าต่างคอนโซลหรือ UAC พร้อมท์

แอปพลิเคชั่นของคอนโซลและไฟล์แบตช์จะทำงานเป็นประจำเมื่อเริ่มต้น Windows หรือตามกำหนดเวลา ความไม่สะดวกหลักของเรื่องนี้คือแต่ละแอปพลิเคชันจะเปิดหน้าต่างคอนโซลที่กะพริบบนหน้าจอ Hidden Start (หรือ Hstart) เป็นยูทิลิตี้บรรทัดคำสั่งที่มีน้ำหนักเบาซึ่งช่วยให้คุณเรียกใช้แอปพลิเคชันคอนโซลและไฟล์แบตช์โดยไม่มีหน้าต่างใด ๆ ในพื้นหลังจัดการสิทธิ์ยกระดับสิทธิ์ UAC ภายใต้ Windows 7 และ Vista .

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


นี่เป็นแอปพลิเคชันที่ออกแบบมาอย่างดีและมีประโยชน์
Guru Josh

5

ทางออกที่ง่ายโดยไม่ต้องใช้โปรแกรมเสริมใด ๆ

  1. สร้างแบตช์ไฟล์ที่คุณต้องการเรียกใช้และทดสอบ
  2. สร้างทางลัดสำหรับมัน
  3. แก้ไขคุณสมบัติของทางลัด: ในแท็บทางลัดเลือกเรียกใช้ย่อขนาดเล็กสุด กำหนดคีย์ลัดให้กับมันและคุณทำเสร็จแล้ว!

โชคดี!


7
นี่ไม่ใช่ทางออกสำหรับปัญหาของ OP มีความแตกต่างระหว่างการย่อขนาดและซ่อน
nixda

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

นั่นเป็นทางออกที่ดีและสะอาดสำหรับปัญหาของฉัน ! ขอขอบคุณ!
dmitry_romanov

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