Windows XP หรือใหม่กว่า Windows: ฉันจะเรียกใช้ไฟล์แบตช์ในพื้นหลังโดยไม่มีหน้าต่างแสดงได้อย่างไร


121

ฉันรู้ว่าฉันได้ตอบคำถามที่คล้ายกันแล้ว (การเรียกใช้ไฟล์แบทช์ในพื้นหลังเมื่อ windows บูทขึ้น ) แต่คราวนี้ฉันต้องเปิดชุด:

  • จากชุดอื่น
  • ไม่มีหน้าต่างคอนโซลใด ๆ ปรากฏขึ้น
  • กับอาร์กิวเมนต์ทั้งหมดที่ส่งไปยังกลุ่มที่มองไม่เห็น

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

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

หมายเหตุ: หน้าต่างคอนโซลของตัวประมวลผลคำสั่ง Windows มีชื่อว่าหน้าต่าง DOS ไม่ถูกต้องโดยคนจำนวนมาก


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

  • จากสคริปต์ที่สองในหน้าต่างคอนโซลstart /bก็เพียงพอแล้ว
  • จาก Windows โดยไม่เรียกใช้หน้าต่างที่สองโซลูชันของฉันยังคงใช้ได้

คุณกำลังเรียกใช้ไฟล์แบตช์จากไฟล์แบตช์ ANOTHER หรือไม่? ไฟล์แบตช์ที่รันอยู่แล้วมีหน้าต่างหรือไม่
Oddthinking

ใช่ชุดอื่น ๆ (ชุดแรก) นี้ดำเนินการในหน้าต่าง DOS อย่างไรก็ตามฉันไม่ต้องการให้ชุดที่สอง (เปิดโดยครั้งแรกในแบบอะซิงโครนัส) แสดงหน้าต่างด้วย (ซึ่งจะเกิดขึ้นพร้อมกับคำสั่ง 'start / b')
VonC

คำตอบ:


53

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

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


1
แก้ไข. ฉันเชื่อว่า start / b จะเปิดหน้าต่างใหม่ แต่ถ้าดำเนินการจากหน้าต่าง DOS มันจะแชร์หน้าต่างเดียวกัน
VonC

110

นี่คือทางออกที่เป็นไปได้:

จากสคริปต์แรกของคุณเรียกสคริปต์ที่สองของคุณด้วยบรรทัดต่อไปนี้:

wscript.exe invis.vbs run.bat %*

จริงๆแล้วคุณกำลังเรียกสคริปต์ vbs ด้วย:

  • [path] \ name ของสคริปต์ของคุณ
  • อาร์กิวเมนต์อื่น ๆ ทั้งหมดที่สคริปต์ของคุณต้องการ ( %*)

จากนั้น invis.vbs จะเรียกสคริปต์ของคุณด้วยเมธอด Windows Script Host Run ()ซึ่งใช้เวลา:

  • intWindowStyle: 0 หมายถึง "หน้าต่างที่มองไม่เห็น"
  • bWaitOnReturn: false หมายความว่าสคริปต์แรกของคุณไม่จำเป็นต้องรอให้สคริปต์ที่สองของคุณเสร็จสิ้น

นี่คือ invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
ดู 2k ครั้งและโพสต์ + คำตอบที่ยอดเยี่ยมมีคนโหวตกระทู้นี้มากขึ้น
Ric Tokyo

ทางออกที่ดีสิ่งที่ฉันต้องการ
nikhil

ปัญหาเดียวคือการสร้างกระบวนการที่ชื่อ "cmd.exe" ซึ่งหาได้ยากในอนาคต
Aditya Gupta

12

แปลงไฟล์แบตช์เป็น exe ลองใช้Bat To Exe ConverterหรือOnline Bat To Exe Converterแล้วเลือกตัวเลือกเพื่อเรียกใช้เป็นแอปพลิเคชั่นโกสต์นั่นคือไม่มีหน้าต่าง


3
เป็นไปได้ แต่ฉันจะพยายามหลีกเลี่ยงขั้นตอนเพิ่มเติมในอินสแตนซ์นี้
VonC

21
ฉันมักจะไม่หวาดระแวงขนาดนั้น แต่มันจะไม่โง่มากที่ปล่อยให้ใครบางคนที่ไม่เปิดเผยตัวสร้าง exe ให้ฉัน? สามารถฉีดสิ่งที่เป็นอันตรายได้ทุกชนิด
Tobias

9

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

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

คัดลอกบรรทัดด้านบนไปยังโปรแกรมแก้ไขและบันทึกไฟล์ด้วยนามสกุล. VBS แก้ไขชื่อไฟล์. BAT และพา ธ ตามนั้น


1
แนวทางที่น่าสนใจสั้นกว่าวิธีแก้ปัญหาของฉันอย่างแน่นอน +1
VonC

ทางออกที่ดี การอ่านสิ่งนี้ฉันสังเกตเห็นว่าไม่จำเป็นต้องใช้จริงๆSet WshShell = Nothingทำงานได้ดีสำหรับฉันและคุณสามารถมีวิธีที่เล็กกว่านี้ได้
Patrick Bard

7

นี่คือชุดวิธีการของฉันในการบรรลุเป้าหมายนั้น - และอื่น ๆ - ที่เป็นไปได้ฉันได้พยายามส่งคืน PID ของกระบวนการเริ่มต้นด้วย (สคริปต์ที่เชื่อมโยงทั้งหมดสามารถดาวน์โหลดและบันทึกด้วยชื่อใดก็ได้ที่คุณสะดวก):

1) โซลูชันIEXPRESSสามารถใช้ได้แม้ในเครื่องวิน 95/98 รุ่นเก่า Iexpress เป็นเครื่องมือโบราณจริงๆที่ยังคงมาพร้อมกับ Windows เนื่องจากอาร์กิวเมนต์ยอมรับเฉพาะคำสั่งและอาร์กิวเมนต์เท่านั้น

ตัวอย่างการใช้งาน:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - ยอมรับเพียงสองอาร์กิวเมนต์ - คำสั่งและอาร์กิวเมนต์ตรวจสอบด้วยว่าเริ่มต้นด้วยสิทธิ์ที่สูงขึ้นหรือไม่และหากเป็นไปได้ให้รับ PID ของกระบวนการด้วย WEVTUTIL (มีให้จาก Vista ขึ้นไปดังนั้น Windows เวอร์ชันใหม่กว่าจะได้รับ PID)

ตัวอย่างการใช้งาน:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - สคริปต์เป็นกระดาษห่อหุ้มแบบเต็มของ 'WScript.Shell' และตัวเลือกที่เป็นไปได้ทั้งหมดสามารถตั้งค่าได้ผ่านตัวเลือกบรรทัดคำสั่งมันเป็นไฮบริด jscript / batch และสามารถเรียกได้ว่าเป็นค้างคาว

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์วิธีใช้ด้วย '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - เสื้อคลุมแบบเต็มอีกครั้งและตัวเลือกทั้งหมดสามารถเข้าถึงได้ผ่านอาร์กิวเมนต์บรรทัดคำสั่งคราวนี้เป็น WSF / batch hybrid กับ Jscript บางตัวและโค้ด VBScript บางส่วน แต่จะส่งคืน PID ของกระบวนการที่เริ่มต้นหากกระบวนการคือ ไม่ได้ซ่อนตัวเลือกบางอย่างเช่นพิกัด X / Y สามารถใช้ได้ (ไม่สามารถใช้ได้กับทุกไฟล์ปฏิบัติการ - แต่ตัวอย่างเช่น cmd.exe ยอมรับพิกัด)

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์วิธีใช้ด้วย '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5). วิธีการแก้ปัญหา NET ใช้ตัวเลือกส่วนใหญ่ของตัวเลือก ProcessStartInfo (แต่ในตอนท้ายฉันเหนื่อยเกินไปที่จะรวมทุกอย่าง):

ตัวอย่างการใช้งาน (สำหรับข้อมูลเพิ่มเติมพิมพ์วิธีใช้ด้วย '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

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

batchfile เพื่อเริ่มต้นสิ่งนี้อาจมีลักษณะเช่นนี้ (ยังไม่ทดลอง):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

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

คุณต้องดาวน์โหลด Windows 2003 Resource Kitเพื่อดาวน์โหลด ชุดทรัพยากรยังสามารถติดตั้งบน Windows เวอร์ชันอื่น ๆ เช่น Windows XP


1
น่าสนใจ แต่มีความซับซ้อนมากเกินไปสำหรับสถานการณ์นี้
VonC

2

เรียกใช้ภายใต้ชื่อผู้ใช้อื่นโดยใช้ "runas" หรือโดยการตั้งเวลาภายใต้ผู้ใช้รายอื่นใน Windows Scheduled Tasks


เป็นไปได้ แต่ไม่ใช่สิ่งที่ฉันต้องการ (การโทรแบบอะซิงโครนัสโดยตรงในพื้นหลัง)
VonC

0

คุณสามารถเรียกใช้ไฟล์. bat ของคุณผ่านไฟล์. vbs
คัดลอกรหัสต่อไปนี้ลงในไฟล์. vbs ของคุณ:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

คุณยังสามารถใช้

start /MIN notepad.exe

PS: โชคไม่ดีที่สถานะหน้าต่างย่อเล็กสุดขึ้นอยู่กับคำสั่งที่จะเรียกใช้ VG ไม่ทำงาน

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