รันไฟล์. bat ในภารกิจที่กำหนดเวลาไว้โดยไม่มีหน้าต่าง


143

ฉันมีงานที่กำหนดเวลาไว้ซึ่งเริ่มสคริปต์ชุดที่ทำงานrobocopyทุกชั่วโมง ทุกครั้งที่มีหน้าต่างปรากฏขึ้นบนเดสก์ท็อปด้วยเอาท์พุทของ robocopy ซึ่งฉันไม่ต้องการเห็น

ฉันจัดการเพื่อให้หน้าต่างปรากฏลดลงโดยทำให้งานตามกำหนดเวลาทำงาน

cmd /c start /min mybat.bat

แต่นั่นทำให้ฉันมีหน้าต่างคำสั่งใหม่ทุกชั่วโมง ฉันรู้สึกประหลาดใจกับสิ่งนี้ที่ได้รับcmd /c"ดำเนินการคำสั่งที่ระบุโดยสตริงและยุติแล้ว" - ฉันต้องเข้าใจเอกสารผิด

มีวิธีเรียกใช้สคริปต์ชุดงานโดยไม่โผล่หน้าต่าง cmd หรือไม่


ฉันพบคำตอบที่ดีกว่าstackoverflow.com/questions/6568736/…
Efekt

คำตอบ:


144

คุณสามารถเรียกใช้งานได้อย่างเงียบ ๆ โดยใช้ไฟล์ Windows Script แทน วิธีการเรียกใช้ช่วยให้คุณสามารถเรียกใช้สคริปต์ในโหมดที่มองไม่เห็น สร้าง.vbsไฟล์เช่นนี้

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

และกำหนดเวลา อาร์กิวเมนต์ที่สองในตัวอย่างนี้ตั้งค่าลักษณะหน้าต่าง 0 หมายถึง "ซ่อนหน้าต่าง"

ไวยากรณ์ที่สมบูรณ์ของวิธีการเรียกใช้ :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

อาร์กิวเมนต์:

  • วัตถุ: วัตถุ WshShell
  • strCommand: ค่าสตริงที่ระบุบรรทัดคำสั่งที่คุณต้องการเรียกใช้ คุณต้องรวมพารามิเตอร์ใด ๆ ที่คุณต้องการส่งผ่านไปยังไฟล์ที่ปฏิบัติการได้
  • intWindowStyle: ไม่จำเป็น ค่าจำนวนเต็มระบุถึงลักษณะที่ปรากฏของหน้าต่างของโปรแกรม โปรดทราบว่าไม่ใช่ว่าทุกโปรแกรมจะใช้ข้อมูลนี้
  • bWaitOnReturn: ไม่บังคับ ค่าบูลีนที่ระบุว่าสคริปต์ควรรอให้โปรแกรมทำงานเสร็จก่อนที่จะดำเนินการกับคำสั่งถัดไปในสคริปต์ของคุณ หากตั้งค่าเป็นจริงการดำเนินการสคริปต์จะหยุดจนกว่าโปรแกรมจะเสร็จสิ้นและ Run จะส่งคืนรหัสข้อผิดพลาดใด ๆ ที่ส่งคืนโดยโปรแกรม หากตั้งค่าเป็นเท็จ (ค่าเริ่มต้น) วิธีการเรียกใช้จะกลับมาทันทีหลังจากเริ่มโปรแกรมโดยส่งคืน 0 โดยอัตโนมัติ (ไม่ต้องตีความว่าเป็นรหัสข้อผิดพลาด)

+1 เพียงเขียนสิ่งเดียวกัน
Sam Cogan

ฉันเห็นมันก่อนที่คุณจะลบมัน ฉันเดาว่าเราทั้งคู่เป็นบอท ;-)
splattne

1
ชื่อผู้ใช้ฉันคิดอย่างสุจริตว่าแซมสมควรได้รับมากกว่าฉัน แต่ขอบคุณนะ! และอย่าพูดถึงฉันและ Jon Skeet ในประโยคเดียวกัน นั่นเป็นการดูหมิ่น! ;-)
splattne

3
สำหรับคำถาม "มีวิธีเรียกใช้สคริปต์ชุดงานโดยไม่เปิดหน้าต่าง cmd หรือไม่" มันให้คำตอบโดยตรง: เรียกใช้โดยใช้ไฟล์ Windows Script
ทำเครื่องหมาย Meuer

2
@ ฉันชอบเดาว่าอัญประกาศเป็นสิ่งจำเป็นหากเส้นทางของคุณมีช่องว่าง
splattne

58

คุณกำลังใช้งานนี้เป็นงานตามกำหนดเวลาหรือไม่? หากตั้งค่าให้ทำงานเป็นบัญชีผู้ใช้อื่นผู้ใช้ที่เข้าสู่ระบบจะไม่สามารถมองเห็นได้ หากสคริปต์ไม่จำเป็นต้องเข้าถึงเครือข่ายรายการที่ต้องการ windows auth (เช่นการแชร์ไฟล์หรือเครื่องพิมพ์) คุณสามารถเรียกใช้เป็น "nt Authority \ system" และปล่อยให้รหัสผ่านว่างเปล่า บน Windows 7 เพียงแค่ตั้งค่าผู้ใช้เป็นระบบแล้วกดตกลง

(คุณอาจต้องใช้ผู้ใช้จริงแม้ว่าคุณจะใช้ robocopy ... )

จูเนียร์


3
ขอบคุณ - นี่มันยุ่งยากน้อยกว่าสำหรับฉันมากกว่าตัวเลือก. vbs
mackenir

8
ฉันตั้งค่าผู้ใช้ "Run as" เป็น SYSTEM (ซึ่งภายหลังเปลี่ยนเป็น NT AUTHORITY \ SYSTEM) และมันใช้งานได้สำหรับฉัน ฉันไม่เห็นหน้าต่าง CMD ป๊อปอัพอีกต่อไปเมื่องานตามกำหนดของฉันทำงาน ขอบคุณ!
Ryan Stille

1
+1 นี่คือสง่างาม อย่าลืมใส่ "ระบบ" เป็นชื่อผู้ใช้จากนั้น win7 จะจัดการให้คุณเอง โปรดทราบว่าคุณได้รับการเข้าถึงเครือข่ายอินเทอร์เน็ตไม่เพียงแชร์เครือข่ายและสิ่งที่ต้องใช้ Windows auth
samsmith

1
ผู้ใช้ระบบนั้นเรียบง่ายและสง่างามเคล็ดลับที่ยอดเยี่ยม! +1!
Matteo Conta

1
ดูการดำเนินการอย่างน้อย-Privilege รุ่นปกครอง การใช้บัญชีระบบนี้เป็นการละเมิดนโยบาย Least-Privilege หรือไม่ ถ้าเป็นเช่นนั้นผู้ดูแลระบบควรรู้ที่จะไม่ทำเช่นนี้ในสถานการณ์ส่วนใหญ่
user34660

29

เพียงกำหนดค่าภารกิจตามกำหนดเวลาเป็น "เรียกใช้ว่าผู้ใช้เข้าสู่ระบบหรือไม่"


6
ที่สมบูรณ์แบบ! คุณสามารถปิดการใช้งานที่จัดเก็บข้อมูลรับรองแล้วสิ่งนี้จะกลายเป็นความปลอดภัยมากกว่าการให้ระบบเรียกใช้!
binki

17

คุณสามารถลองใช้CHP (สร้างกระบวนการที่ซ่อนอยู่)ทำสิ่งที่คุณคิดว่า ...

CHP.EXE mybat.bat

ทำงานโดยไม่มีหน้าต่างคำสั่ง ที่สมบูรณ์แบบ! ทำโดยคนเดียวกันกับ CMDOW แต่สิ่งนี้เหมาะสมกว่า


ทำงานได้อย่างสมบูรณ์แบบเมื่อคุณต้องการเรียกใช้งานในบริบทของผู้ใช้ที่เข้าสู่ระบบ ("ทริกเกอร์: เมื่อเชื่อมต่อกับเซสชันผู้ใช้", "เรียกใช้งานเป็น: ผู้ใช้")
Sergei

1
นี่ไม่ใช่เครื่องมือในตัว
JonnyRaa

9

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

สิ่งที่ง่ายที่สุดสิ่งหนึ่งที่ต้องทำคือซ่อนหน้าต่างปัจจุบัน (มักเป็นบรรทัดแรกในไฟล์ bat) ด้วย:

cmdow @ /hid

หรือเริ่มกระบวนการที่ซ่อนอยู่ใหม่ด้วย

cmdow /run /hid mybat.bat 

4
ข้อเสนอแนะทั้งสองนี้และ Rocketmonkeys เกี่ยวข้องกับการดาวน์โหลดเครื่องมือใหม่ซึ่งหมายถึงความเข้ากันได้มากกว่าบนเดสก์ท็อปของผู้คนหลากหลาย การอบโดยใช้คำสั่ง windows ดีกว่ามาก
IanVaughan

บวกกับการตรวจพบ cmdow ว่า "เป็นอันตราย" โดยโปรแกรมต่อต้านไวรัสบางโปรแกรม ( ไม่เป็นอันตราย แต่การตรวจจับสามารถทำให้เกิดปัญหาได้หากไฟล์ cmdow ถูกกักกัน ... )
Otiel

3
ยังคงมีคอนโซลป๊อปอัพเพียงแฟลชอย่างรวดเร็วมาก
Bamboo

5

ลองเรียกใช้สคริปต์ด้วย

start /b <command>

1
สิ่งนี้ใช้ไม่ได้งานตามกำหนดเวลา -> สถานะสถานะ "ไม่สามารถเริ่ม" นั่นคือ: start / b C: \ file.bat: และ: start / b "C: \ file.bat": แต่: C: \ file.bat: ใช้งานได้ดี
IanVaughan

1
เพราะstartไม่ใช่โปรแกรมมันเป็นคำสั่ง คุณต้องระบุcmdเป็นโปรแกรมเพื่อเรียกใช้และ/c start /b <file>เป็นอาร์กิวเมนต์ อย่างไรก็ตามนี่ยังคงไม่สามารถใช้งานได้เนื่องจากมันจะยังคงสร้างหน้าต่างคอนโซลสำหรับcmdและแฟลชหน้าต่างสีดำบนหน้าจอ
Synetech

1
ยังสามารถยืนยันด้วย @Synetech ได้ว่าจะไม่สร้างหน้าต่างใหม่ แต่คุณยังต้องเปิดหน้าต่างคอนโซลเพื่อเริ่มต้น นี่เป็นคำสั่งที่ใช้งานง่าย แต่ไม่สามารถใช้ได้ตามที่ร้องขอกับ Scheduled Tasks
JonathanDavidArndt

5

คุณสามารถสร้างทางลัดไปยังแฟ้มแบตช์ตั้งค่าทางลัดเพื่อเริ่มย่อให้เล็กสุด (ในคุณสมบัติของทางลัดแท็บ 'ทางลัด') จากนั้นตั้งค่างานให้เริ่มทางลัด

ข้อสำคัญ : คุณจะต้องระบุเส้นทางไปยังทางลัดด้วยตนเองโดยพิมพ์ลงในฟิลด์เรียกใช้ข้อความพร้อมด้วยส่วนขยาย '.lnk' ถ้าคุณเพียงแค่พยายามที่จะเรียกดูไปมันจะเป็นประโยชน์เปลี่ยนเส้นทางของตัวเองกับสิ่งที่จุดทางลัดไปยัง


สิ่งนี้ใช้ไม่ได้กับ Windows 10 x64 สิ่งนี้ให้ป๊อปอัป "คุณต้องการเปิดไฟล์นี้อย่างไร"
Jan

1

ฉันรู้ว่าคำถามนี้ได้รับการตอบแล้วด้วยความละเอียดที่สมบูรณ์แบบที่เป็นของ Windows และดังนั้นจึงควรเข้ากันได้มากที่สุดและฉันเห็นด้วยอย่างสมบูรณ์

ฉันยังอยากจะบอกว่าฉันไม่เห็นด้วยกับความคิดเห็นของ @ splattne (แต่ไม่ใช่คำตอบที่แท้จริงของเขา) - ว่าการแก้ไขในหัวข้ออ้างอิงอื่นควรได้รับเครดิต คำตอบนั้นเกี่ยวข้องกับการเรียกใช้สคริปต์ในฐานะผู้ใช้อื่น (SYSTEM) ซึ่งค่อนข้างเทียบเท่ากับการให้สิทธิ์การเข้าถึงรูทสคริปต์ มันจะล้มเหลวสำหรับงานเช่นROBOCOPY(ตามที่อ้างอิงโดย John Rennie) ซึ่งต้องการการเข้าถึงเครือข่าย

ฉันไม่เคยลองCMDOWมาก่อน แต่ฉันต้องการที่จะนำเสนอความละเอียดที่คล้ายกันซึ่ง [แม้ว่าจะไม่ได้ติดตั้งใน Windows] ยังคงพกพาได้ดีกับรุ่นส่วนใหญ่และมาในรุ่น 32 และ 64 บิตและนั่นคือNirCmd

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

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

จากexecส่วนของการอ้างอิงคำสั่ง NirCmd :

exec [show/hide/min/max] [application + command-line]

เรียกใช้แอปพลิเคชันและเลือกระบุพารามิเตอร์บรรทัดคำสั่งอย่างน้อยหนึ่งรายการสำหรับแอปพลิเคชันที่ดำเนินการ พารามิเตอร์[แสดง / ซ่อน / ขั้นต่ำ / สูงสุด] ระบุว่าแอปพลิเคชันที่รันอยู่จะสามารถมองเห็นได้หรือไม่ หากระบุ 'ซ่อน' ผู้ใช้จะไม่เห็นแอปพลิเคชันที่ทำงานอยู่ หากระบุ 'max' หน้าต่างแอปพลิเคชันที่ทำงานอยู่จะถูกขยายให้ใหญ่สุด หากระบุ 'min' หน้าต่างแอปพลิเคชันที่ทำงานอยู่จะถูกย่อให้เล็กสุด

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

แก้ไข 2: ด้วยเหตุผลบางอย่างมันจะไม่ทำงานในฐานะ SYSTEM (อาจเป็นสิ่งที่เข้าถึงเครือข่ายที่อ้างถึงก่อนหน้านี้) - ฉันเพิ่งสังเกตเห็นว่าหลังจากทำงานROBOCOPYโดยไม่มีแฟล็ก / L ซึ่งจริงๆแล้วเป็นเพียงการจำลองและ [ชัด ๆ ] ไม่ จริง ๆ แล้วเชื่อมต่อกับระบบระยะไกล แต่เมื่อฉันเรียกใช้แฟ้มแบตช์ที่มีสิทธิ์สูงสุดและตรวจสอบกล่องที่ซ่อนอยู่และฉันยังสามารถเรียกใช้ในฐานะผู้ใช้ที่ลงชื่อเข้าใช้ในพื้นหลังโดยไม่แสดงหน้าต่างคำสั่ง .



-2

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


-2

ในการซ่อนเอาต์พุต (แม้ว่าไม่ใช่หน้าต่าง) ให้เพิ่มส่วนนี้ไว้ที่จุดเริ่มต้นของไฟล์แบตช์ของคุณ:

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