การเขียนเอาต์พุต ECHO ไปยังไฟล์ VBS ไม่ทำงาน


4

ฉันกำลังเขียน Batch Script ที่สร้าง VB Script โดย echoing แต่ละบรรทัดและนำผลลัพธ์ไปยังไฟล์ที่สร้างขึ้น มันใช้งานได้เป็นส่วนใหญ่ยกเว้นสองบรรทัดที่รับตัวแปร Command Line และใช้เป็นตัวแปร VBS นี่คือรหัส:

ECHO:strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
ECHO:strProgramData = oShell.ExpandEnvironmentStrings^(^"^%ProgramData^%^"^) >> uninstallBeta.vbs

ควรมีลักษณะเช่นนี้ใน VB Script:

strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramData = oShell.ExpandEnvironmentStrings("%ProgramData%")

แต่สิ่งที่เกิดขึ้นคือสคริปต์แบทช์เป็นเพียง Echos >> uninstallBeta.vbsเส้นรวมทั้ง มีความคิดว่าทำไมสิ่งนี้เกิดขึ้น? ฉันมีบรรทัดที่คล้ายกันสำหรับการสร้างสคริปต์ VBS และ Batch อื่น ๆ ที่ฉันคิดว่าใช้ได้ผลอย่างนี้ ฉันตรวจสอบความผิดพลาดแล้ว แต่ไม่พบ มันทำงานได้ดีใน Command Prompt แต่ไม่ใช่ใน Batch Script


ฉันค้นพบวิธีแก้ปัญหาที่แก้ไขได้ แต่ฉันก็ยังต้องการทราบสาเหตุที่เกิดขึ้น
พระบุตรของพระเจ้า

คุณอาจต้องการดูstackoverflow.com/a/9074483/1012053โดยเฉพาะส่วนUPDATE 2014-04-27ที่ด้านล่างเพื่อหาวิธีหลีกเลี่ยงการสร้างไฟล์ VBS แยกต่างหาก คุณสามารถเรียกใช้ VBS ได้โดยตรงภายในสคริปต์ชุด!
dbenham

@ dbenham ฉันเห็นว่าเมื่อวานนี้ก่อนใครตอบ จะลองพิจารณาดูว่า
บุตรของพระเจ้า

คำตอบ:


7

ช่วยให้เข้าใจว่า 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.

@Facebook - ฉันไม่รู้ว่าคุณกำลังอ้างถึงสถานการณ์อะไร ฉันจะต้องเห็นตัวอย่างที่เป็นรูปธรรม หากคุณเข้าใจสถานการณ์ที่เป็นปัญหาแน่นอนให้โพสต์คำถามใหม่ทั้งที่นี่หรือใน StackOverflow
dbenham

นี่มันคือมนุษย์ .... superuser.com/questions/1261588/
Pimp Juice IT

2

ฉันลองมันและมันก็ใช้ได้ตามที่คาดไว้ด้วย

set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)

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


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