ช่วยให้เข้าใจว่า cmd.exe แยกวิเคราะห์สคริปต์ชุดงานได้อย่างไร:
ส่วนที่ 1 - ภาพรวม
ส่วนที่ 2 - รายละเอียดการขยายตัวร้อยละ
ฉันจะทำงานผ่านการประมวลผลของบรรทัดแรกที่ผิดพลาด:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
การประมวลผลเปอร์เซ็นในระยะที่ 1 เกิดขึ้นก่อนที่จะ^
หลบหนีการประมวลผลในเฟส 2 ดังนั้นตัวแยกวิเคราะห์จะค้นหาตัวแปรสภาพแวดล้อมที่มีชื่อUSERPROFILE^
และไม่สามารถค้นหาได้ ดังนั้นจะขยายเป็นสตริงว่างโดยปล่อยให้:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs
ถัดไปคาเร็ตจะถูกประมวลผลเพื่อหนีอักขระในเฟสที่สอง สิ่งสำคัญคือสิ่งแรก^"
คือคำพูดที่หลบหนีดังนั้นตัวละครหลังจากนั้นจะไม่ถูกยกมา สิ่งต่อไป^^
คือคาเร็ตที่หลบหนี กว่าตามคำพูดแรกที่ไม่ได้หลบหนีดังนั้นตัวละครทั้งหมดจะถูกยกมา ฉันหมายถึงว่าด้วย Q ด้านบนอักขระที่ยกมาแต่ละตัว:
QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs
มันควรจะชัดเจนว่าทำไมการ>>
เปลี่ยนเส้นทางไม่ทำงาน - มันถูกยกมาเพื่อทำหน้าที่เป็นตัวอักษรสตริงแทน
คุณพยายามที่จะหลบหนี%
เป็น^%
เพื่อป้องกันการขยายตัวของตัวแปรภายในชุด ที่ใช้งานไม่ได้ สิ่งที่ถูกต้องคือการเพิ่มเปอร์เซ็นต์สองเท่า:
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs
หากบรรทัดอยู่ในบล็อกที่มีเครื่องหมายวงเล็บคุณจะต้องหลีกเลี่ยง)
แต่(
ก็ไม่จำเป็นต้องหลบหนี
for .... do (
...
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
...
)
โปรดทราบว่ากฎแตกต่างจากบรรทัดคำสั่ง ไม่มีกลไกในการหลีกเลี่ยง a %
ภายในบรรทัดคำสั่งอย่างแท้จริงและบรรทัดคำสั่งจะเก็บรักษา%undefinedVar%
ข้อความหากตัวแปรไม่ได้กำหนดไว้ อย่างไรก็ตามคุณสามารถป้องกันการขยายตัวของตัวแปรได้อย่างมีประสิทธิภาพโดยการรวมอย่างน้อยหนึ่งอย่าง^
ระหว่างร้อยละเพื่อไม่ให้พบตัวแปร เครื่องหมายรูปหมวกจะหายไปในระยะที่ 2 แต่คำพูดแรกจะต้องมีการหลบหนีเพื่อให้ภายใน^
หายไป และเครื่องหมายคำพูดสุดท้ายต้องหนีเพื่อให้การเปลี่ยนเส้นทางทำงาน
สิ่งนี้ทำงานได้จากบรรทัดคำสั่ง (แต่ไม่อยู่ในชุดสคริปต์):
echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs
เครื่องหมายรูปหมวกสามารถปรากฏที่ใดก็ได้ระหว่างเปอร์เซ็นต์ ทั้งหมดต่อไปนี้จะใช้ได้เช่นกัน:
%USER^PROFILE%
%^USERPROFILE%
etc.