ไฟล์ทางลัดไม่เริ่มทำงานเสมอเมื่อกดปุ่มทางลัด


2

ที่ บริษัท ของฉันเรามีเวิร์คสเตชั่ขนาดเล็ก ~ 13 นิ้วพร้อมหน้าจอสัมผัส
ระบบปฏิบัติการคือ: Microsoft Windows Embedded Standard 6.1.7601 Service Pack 1 Build 7601
เวิร์กสเตชันมี 5 ปุ่มที่สามารถแมปสำหรับการรวมคีย์ใด ๆ (ตัวอย่างctrl+alt+shift+[any key on the keyboard])

มีโปรแกรมสองโปรแกรมที่ต้องทำงานกับโปรแกรมเพื่อให้พนักงานสามารถทำงานได้ บางครั้งคนงานปิดโปรแกรมหนึ่งโดยไม่ตั้งใจดังนั้นฉันจึงตัดสินใจแก้ปัญหานี้เนื่องจากพวกเขาไม่สามารถเริ่มโปรแกรมได้ด้วยตนเอง

ดังนั้นฉันมี:
- สร้างไฟล์แบทช์ว่าเมื่อเริ่มต้นมันจะตรวจสอบว่าโปรแกรมกำลังทำงานอยู่ถ้าไม่มันจะเริ่มพวกเขา;
- สร้างทางลัดของไฟล์แบตช์ ( %appdata%\Microsoft\Windows\Start Menu\Programsตามที่แนะนำที่นี่ );
- เพิ่มคีย์ลัด (ctrl + alt + s);
- กำหนดหนึ่งในปุ่มบนเวิร์กสเตชันให้กับการเชื่อมโยงคีย์

ดูเหมือนว่าเป็นความคิดที่ดีในทางทฤษฎี แต่ในทางปฏิบัติแล้วการเชื่อมคีย์ลัดไม่ทำงานอย่างถูกต้อง

หลังจากการแก้ไขปัญหาฉันรู้ว่าหนึ่งในโปรแกรมนั้นเป็นสาเหตุของปัญหา
ให้เรียกโปรแกรมและA Bเมื่อBหรือเดสก์ท็อปอยู่ด้านหน้าชุดคีย์จะทำงานอย่างถูกต้องและเปิดไฟล์แบตช์ Aใช้งานได้เต็มหน้าจอ ดังนั้นเมื่อมีการกดคีย์ผสมในขณะที่Aอยู่ด้านหน้ามันจะไม่ทำงาน
ดังนั้นฉันจึงกำหนดalt + tabคีย์ผสมสำหรับปุ่มอื่น แต่นี่คือปัญหาที่เกิดขึ้น

หากก่อนหน้านี้ฉันกดctrl + alt + Sคีย์ผสมในขณะที่Aอยู่ข้างหน้ามันจะไม่ทำงานหลังจากนั้นแม้ว่าฉันจะเปลี่ยนไปใช้Bหรือไปยังเดสก์ท็อปก็ตาม

สิ่งที่ทำให้มันน่าสนใจกว่าคือถ้าฉันสร้างคีย์ลัดอีกอันในไฟล์ทางลัดอื่นให้พูดctrl + alt + Dและเรียกใช้หลังจากctrl + alt + Sหยุดทำงานมันจะแก้ไขและctrl + alt + Sเริ่มทำงานอีกครั้งในขณะBที่เดสก์ท็อปโฟกัส

พยายามนี้ไม่ทำงาน
สีแดงนี้ฟอรั่ม ไม่มีทางออก

ฉันกำลังมองหาวิธีแก้ปัญหา / วิธีแก้ปัญหา / วิธีอื่นในการแก้ปัญหานี้

ฉันไม่ต้องการติดตั้งโปรแกรมบุคคลที่สามใด ๆ อย่างไรก็ตามฉันสามารถแก้ไขการตั้งค่าและรีจิสทรีได้หากจำเป็น

แก้ไข:

ไฟล์แบตช์

echo off
tasklist /FI "IMAGENAME eq progB.exe" 2>NUL | find /I /N "progB.exe">NUL
if "%ERRORLEVEL%"=="1" (
cd C:\<progB path>
start /MAX progB.exe

)

tasklist /FI "IMAGENAME eq progA.exe" 2>NUL | find /I /N "progA.exe">NUL
if "%ERRORLEVEL%"=="1" C:\<progA path>

exit

1
ปุ่มลัดไม่สม่ำเสมอ วิธีการแก้ปัญหาที่โหดเหี้ยมจะกำหนดเวลาการดำเนินการของไฟล์แบทช์ซ้ำทุกนาที หากโปรแกรมกำลังทำงานอยู่ฉันไม่คิดว่าผู้ใช้จะเห็นได้ชัดเจน
harrymc

@harrymc - ฉันกำลังคิดถึงบางสิ่งที่คล้ายกัน แต่อาจทำให้เกิดปัญหาหากผู้ปฏิบัติงานกำลังสแกนและโปรแกรมหมดโฟกัส นอกจากนี้เวิร์คสเตชั่ทำงานช้าเล็กน้อยและแม้กระทั่งไฟล์แบตช์แบบนี้มันใช้เวลา 5-10 วินาทีในการรัน
Divin3

5-10 วินาทีเพื่อตรวจหาว่าโปรแกรมกำลังทำงานอยู่หรือไม่ หากคุณเผยแพร่ไฟล์แบตช์เราอาจจะสามารถปรับปรุงได้
harrymc

@harrymc - อัปเดต ใช้เวลานานเพราะเวิร์คสเตชั่ช้าเกินไป
Divin3

ฉันไม่รู้ว่าคุณมีอะไรในระบบเหล่านี้ WMIC WMIC process get Caption | find /i /n "prog.exeอาจจะเร็วขึ้น: นอกจากนี้ยังมี Powershell Get-Process และ Powershell ผ่าน WMI: Get-WMIObject Win32_Process
harrymc

คำตอบ:


1

วิธีการแก้ปัญหาแบบ brute-force คือกำหนดตารางเวลาการเรียกใช้ไฟล์แบตช์ซ้ำทุกนาที เป้าหมายคือถ้าโปรแกรมกำลังทำงานอยู่การตรวจสอบนี้จะไม่สามารถสังเกตได้โดยผู้ใช้

น่าเสียดายที่คอมพิวเตอร์ช้าเหล่านี้ที่ใช้ Windows Embedded Standard 6 รายการงานและตัวแปรนั้นช้าเกินไปเราจึงต้องหากลไกอื่นเพื่อตรวจสอบว่าโปรแกรมกำลังทำงานอยู่หรือไม่ โชคดีที่ดูเหมือนว่าการตรวจสอบการมีอยู่ของไฟล์นั้นยังเร็วมาก

กลไกที่ฉันเสนอคือเปิดโปรแกรมโดยใช้ไวยากรณ์นี้:

prog 2 >> \path\to\lockfile

พารามิเตอร์ "2 >> file" แสดงว่าไฟล์ข้อผิดพลาดของ prog ถูกเปลี่ยนเส้นทางไปยัง lockfile ไฟล์นี้เรียกว่า stderr บน Linux โดยปกติแล้วโปรแกรมส่วนใหญ่จะไม่เขียนถึง ในขณะที่โปรแกรมกำลังทำงานไฟล์จะถูกล็อคและไม่สามารถลบได้เนื่องจากมันถูกใช้งานอยู่ หากโปรแกรมหยุดทำงานไฟล์อาจมีอยู่หรือไม่ แต่สามารถลบได้

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

@echo off
if exist \path\to\lockfile (
  echo lockfile exists
  del \path\to\lockfile
  if exist \path\to\lockfile (
    echo lockfile is locked - program is running
  ) else (
    echo lockfile was deleted - program is not running
    **launch program here**
  )
) else (
  echo lockfile doesn't exist - program is not running
  **launch program here**
)

ในการปิดโปรแกรมโดยไม่เริ่มโดยอัตโนมัติสำหรับการบำรุงรักษาให้ปิดใช้งานการกำหนดเวลาของไฟล์แบตช์

หรือถ้ามีปัญหามากเกินไปให้เพิ่มไฟล์อื่นที่เรียกว่า "การบำรุงรักษา" และตรวจสอบการมีอยู่ของไฟล์แบตช์โดยไม่ทำอะไรเลยถ้ามีอยู่ ลบไฟล์เมื่อการบำรุงรักษาสิ้นสุดลง

สำหรับการทดสอบสามารถล็อคไฟล์ผ่านสคริปต์ชุดนี้ กดปุ่มใดก็ได้เพื่อหยุด:

pause 2 >> \path\to\lockfile

การอ้างอิง:


ฉันจะทดสอบและแสดงความคิดเห็นโดยเร็ว
Divin3

ฉันเห็นว่านี่เป็นทางออกที่ดีที่สุดเช่นกัน ฉันมีปัญหาหนึ่งที่ฉันพบ ฉันต้องทำให้แบตช์ไฟล์ทำงานในพื้นหลัง ต้องไม่ขโมยโฟกัสแม้กระทั่งกับแฟลชเพราะอาจทำให้การสแกนหยุดชะงัก ทางออกที่ดีที่สุดที่ฉันได้พบมาแล้วคือ%comspec% /c start "" /min <path>\file.bat ^& exitมันยังไม่ทำงานเท่าที่ควร
Divin3

ดูกระทู้นี้: เรียกใช้ไฟล์ชุดในทางที่ซ่อนไว้อย่างสมบูรณ์
harrymc

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

0

วิธีการของคุณในการแก้ไขปัญหานี้มีลักษณะเฉพาะและฟังใกล้ แต่ก็หนีไปจากคุณ คิดไปตามเส้นทางเดิมที่คุณติดตามมานี่คือข้อเสนอ

หากปลอดภัยซึ่งคุณจะต้องพิจารณาอย่างถี่ถ้วนคุณอาจต้องการเลือกใช้การผูกคีย์เพื่อ Alt + F4 แอปพลิเคชัน มันจะดียิ่งขึ้นถ้าคุณสามารถรวม Alt + Tab ก่อนจากนั้นกด Alt + F4 ตามหลักวิชาคุณจะสามารถปิดแอปพลิเคชั่นทั้งสองและกลับสู่เดสก์ท็อปได้โดยการกดปุ่มนี้ผูกสูงสุดสามครั้ง

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

ตัวอย่าง (ทั้งสองแอปพลิเคชันกำลังทำงาน):

  • แอปพลิเคชันAมีโฟกัสหน้าต่าง
  • [กดผูก] Bมีโฟกัสและปิดแล้วกลับโฟกัสไปที่A
  • [กดผูก] desktopมีโฟกัสและไม่มีอะไรปิด
  • [กดผูก] Aมีโฟกัสและปิด

ตัวอย่างที่ 2 ( Bถูกปิด):

  • desktop มีโฟกัสหน้าต่าง
  • [กดผูก] A(ตัวอย่าง) มีโฟกัสและปิดแล้วกลับโฟกัสไปที่desktop

หรือคุณอาจมีหนึ่งปุ่มเพื่อทำ Alt + Tab และอีกปุ่มหนึ่งเพื่อทำ Alt + F4 ผู้ใช้จะต้องกดปุ่ม1ตามด้วยปุ่ม2กดทั้งหมด 3 ครั้งสำหรับแต่ละปุ่ม

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

และเช่นเคยมีวิธีแก้ไขปัญหาของคุณมากกว่าหนึ่งวิธี โซลูชันเฉพาะนี้ยึดตามกระบวนการคิดเริ่มต้นและธีมโดยรวมของคุณ


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