เมื่อเรียกใช้ไฟล์บางไฟล์ (โดยส่วนใหญ่เป็นชุด) โดยใช้ PsExec ฉันจะได้รับสัญลักษณ์แปลก ๆ เหล่านี้ก่อนคำสั่งของฉัน ความคิดเริ่มต้นของฉันคือฉันกำลังใช้การเข้ารหัสที่ไม่ถูกต้อง แต่หลังจากตรวจสอบฉันรู้ว่าไฟล์ทั้งหมดของฉันใช้ UTF-8
เมื่อเรียกใช้ไฟล์บางไฟล์ (โดยส่วนใหญ่เป็นชุด) โดยใช้ PsExec ฉันจะได้รับสัญลักษณ์แปลก ๆ เหล่านี้ก่อนคำสั่งของฉัน ความคิดเริ่มต้นของฉันคือฉันกำลังใช้การเข้ารหัสที่ไม่ถูกต้อง แต่หลังจากตรวจสอบฉันรู้ว่าไฟล์ทั้งหมดของฉันใช้ UTF-8
คำตอบ:
ฉันได้รับสัญลักษณ์แปลก ๆ เหล่านี้ before ก่อนคำสั่งของฉัน […] ไฟล์ทั้งหมดของฉันใช้ UTF-8
นี่มีสองสาเหตุ:
cmd.exeไม่รองรับ UTF-8 มันใช้การเข้ารหัสไบต์เดียวอย่างใดอย่างหนึ่งซึ่งมักเรียกว่า "OEM" - cp437, cp775 และอื่น ๆ ขึ้นอยู่กับการตั้งค่าภูมิภาคของระบบ
(ฉันคาดหวังว่ามันจะรองรับ UTF-16 เช่นกัน แต่ไม่ชัดเจนแม้ว่าจะเพิ่ม UTF-16 BOM)
เครื่องมือแก้ไขข้อความของคุณกำลังเพิ่ม UTF-8 "เครื่องหมายคำสั่งซื้อไบต์" (ไบต์EF
BB
BF
) ไปยังจุดเริ่มต้นของไฟล์ UTF-8 ทั้งหมด
เมื่อcmd.exeอ่านสคริปต์ของคุณจะไม่รู้ว่าจะทำอย่างไรกับเครื่องหมาย - มันเห็น BOM เป็นอักขระ cp437 ธรรมดาสามตัว’
╗
┐
และพยายามใช้มันเป็นส่วนหนึ่งของชื่อคำสั่ง
กำหนดค่าโปรแกรมแก้ไขของคุณเพื่อหยุดการเพิ่ม BOM ไปยังไฟล์ที่เข้ารหัส UTF-8 (มันสมเหตุสมผลใน UTF-16 เท่านั้นและไร้ประโยชน์มากใน UTF-8)
จะรวบรวมไฟล์แบทช์เป็น exe เพื่อแก้ปัญหาหรือไม่
เอ่อ
อะไร
เพื่อเพิ่มเติมคำตอบของ @ dsolimanoถ้าคุณกำลังโดยเฉพาะการใช้Visual Studioและในกรณีของฉันมันเป็น2013ผมคงได้โดยการทำสิ่งต่อไปนี้:
ตอนนี้เมื่อคุณเปิดไฟล์. batจากภายในVisual Studioคุณจะได้รับพร้อมท์ด้วย:
คุณจะต้องเจาะลึกตัวเลือกต่างๆจนกว่าคุณจะมาที่ตัวเลือกDOSในภาษาของคุณ:
คลิกตกลงเพื่อเสร็จสิ้นการเปิดไฟล์
ตกลงแม้ว่าจะเห็นได้ชัดในตอนนี้ถ้าคุณเห็น∩╗┐
ตัวอักษรที่จุดเริ่มต้นของไฟล์มันก็จะทำให้คุณต้องลบมันออกและบันทึกไฟล์ทันทีด้วยการเข้ารหัสที่ถูกต้อง นี่คือสิ่งที่ทำให้คุณไม่ได้รับแจ้งอีกในครั้งต่อไป
ด้วยทั้งหมดที่อยู่ในสถานที่ที่คุณจะดีใจที่รู้ว่าตอนนี้คุณอาจจะดู , แก้ไขและบันทึกของคุณค้างคาวไฟล์ (s) จากภายในVisual Studioเพื่อให้cmd.exeไม่ช่วยให้คุณมีข้อผิดพลาดชั่วร้ายดังกล่าว:
'∩╗┐'ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอก, โปรแกรมที่ทำงานได้หรือไฟล์แบตช์
เหล่านี้คือ Unicode ไบต์สั่งซื้อ Marks Cmd.exe ไม่เข้าใจพวกเขา หากคุณบันทึกไฟล์ของคุณใน Notepad ด้วยการเข้ารหัส ANSI ซึ่งจะช่วยแก้ไขปัญหาได้
ตัวอย่างเช่นฉันสร้างไฟล์แบทช์นี้:
echo Hello World
ก่อนอื่นฉันบันทึกด้วยการเข้ารหัส UTF-8
C:\Users\DSolimano\Desktop\junk>test.bat
C:\Users\DSolimano\Desktop\junk>echo Hello World
'echo' is not recognized as an internal or external command,
operable program or batch file.
จากนั้นด้วย Unicode
C:\Users\DSolimano\Desktop\junk>test.bat
C:\Users\DSolimano\Desktop\junk>■e
'■e' is not recognized as an internal or external command,
operable program or batch file.
และสุดท้ายกับ ANSI
C:\Users\DSolimano\Desktop\junk>test.bat
C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
ตามที่อธิบายไว้ก่อนหน้านี้อักขระนี้เป็นอักขระ Unicode BOM (Byte Order Mark) ที่ใช้เป็นลายเซ็นต์และ cmd.exe นั้นไม่รู้จัก
คุณสามารถลบได้อย่างปลอดภัยในหลาย ๆ
ฉันพบว่าทำง่ายมากดังนี้