Score:1

พฤติกรรมแปลก ๆ ในสคริปต์ Windows 2019 .BAT

ธง cn

ฉันต้องกู้คืนข้อมูลสำรองจาก Linux MariaDB ไปยัง Windows MariaDB ซึ่งเกตเวย์ PowerBI จะนำเข้าข้อมูล "mariabackup" เป็นเครื่องมือสำรองทางกายภาพของ MariaDB แต่หากต้องการกู้คืนโฟลเดอร์ปลายทาง (%programfiles%\MariaDB 10.3\data\) ต้องว่างเปล่า

เนื่องจาก rmdir /S /Q "%programfiles%\MariaDB 10.3\data\" จะลบไดเร็กทอรี "data" (สิ่งที่ฉันไม่ต้องการ !!!) ฉันได้ทำงานเพื่อหลีกเลี่ยงพฤติกรรมที่ไม่ต้องการนี้ในสคริปต์ต่อไปนี้ (uncompress.bat):

rem คลายการบีบอัดข้อมูลสำรองที่ส่งโดยเซิร์ฟเวอร์ linux
rem และนำเข้าไปยัง MariaDB
เรม กิลแบร์โต มาร์ตินส์ - 19/11/2021

rem คลายการบีบอัดข้อมูลสำรอง
rem เส้นทางสำรองคือ "mnt\external01\"
tar -xf c:\users\mariabkp\bkp.tgz -C c:\users\mariabkp\

rem หยุด MariaDB
หยุดสุทธิ mysql

rem เตรียมการสำรองข้อมูลสำหรับการกู้คืน
"C:\Program Files\MariaDB 10.3\bin\mariabackup.exe" --prepare --target-dir="c:\users\mariabkp\mnt\external01\backup"\

rem ลบไฟล์ฐานข้อมูล
del /q "C:\Program Files\MariaDB 10.3\data\*.*"
FOR /D %p IN ("c:\Program Files\MariaDB 10.3\data\*") DO rmdir "%p" /s /q

rem นำเข้าข้อมูลสำรองไปยัง MariaDB
"C:\Program Files\MariaDB 10.3\bin\mariabackup.exe" --move-back --target-dir="c:\users\mariabkp\mnt\external01\backup"\

rem กู้คืนไฟล์ Conf MariaDB
คัดลอก "c:\Users\Administrator\my.ini" "c:\Program Files\MariaDB 10.3\data" /y

rem เริ่ม MariaDB
เริ่มต้นสุทธิ mysql

ฉันทำงานได้ดีจนถึงจุดที่ฉันต้องลบไฟล์เพื่อกู้คืน อย่างที่คุณเห็นข้างหน้า:

Microsoft Windows [เวอร์ชัน 10.0.17763.1935]
(ค) 2018 Microsoft Corporation สงวนลิขสิทธิ์.

C:\Users\Administrator>uncompress.bat

C:\Users\Administrator>rem คลายการบีบอัดข้อมูลสำรองที่ส่งโดยเซิร์ฟเวอร์ linux

C:\Users\Administrator>rem และนำเข้าไปยัง MariaDB

C:\Users\Administrator>rem Gilberto Martins - 19/11/2021

C:\Users\Administrator>rem คลายการบีบอัดข้อมูลสำรอง

C:\Users\Administrator>rem เส้นทางสำรองคือ "mnt\external01\backup"

C:\Users\Administrator>tar -xf c:\users\mariabkp\bkp.tgz -C c:\users\mariabkp\

C:\Users\Administrator>rem หยุด MariaDB

C:\Users\Administrator>net stop mysql
บริการ MySQL กำลังหยุดทำงาน
หยุดบริการ MySQL เรียบร้อยแล้ว


C:\Users\Administrator>rem เตรียมการสำรองข้อมูลสำหรับการกู้คืน

C:\Users\Administrator>"C:\Program Files\MariaDB 10.3\bin\mariabackup.exe" --prepare --target-dir="c:\users\mariabkp\mnt\external01\backup"\
C:\Program Files\MariaDB 10.3\bin\mariabackup.exe อ้างอิงจากเซิร์ฟเวอร์ MariaDB 10.3.31-MariaDB Win64 (AMD64)
[00] 2021-11-22 16:26:29 cd ถึง c:\users\mariabkp\mnt\external01\backup\
[00] 2021-11-22 16:26:29 ขีดจำกัดการเปิดไฟล์ที่ร้องขอ 0 ตั้งค่าเป็น 0
[00] 2021-11-22 16:26:29 เป้าหมายนี้ดูเหมือนจะยังไม่ได้เตรียมการ
[00] 2021-11-22 16:26:29 mariabackup: ใช้การกำหนดค่า InnoDB ต่อไปนี้สำหรับการกู้คืน:
[00] 2021-11-22 16:26:29 innodb_data_home_dir = .
[00] 2021-11-22 16:26:29 innodb_data_file_path = ibdata1:12M:autoextend
[00] 2021-11-22 16:26:29 innodb_log_group_home_dir = .
[00] 2021-11-22 16:26:29 กำลังเริ่มต้นอินสแตนซ์ InnoDB สำหรับการกู้คืน
[00] 2021-11-22 16:26:29 mariabackup: ใช้ 104857600 ไบต์สำหรับบัฟเฟอร์พูล (ตั้งค่าโดยพารามิเตอร์ --use-memory)
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: Mutexes และ rw_locks ใช้ฟังก์ชันที่เชื่อมต่อกันของ Windows
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: ใช้ mutexes เหตุการณ์
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: ตารางที่บีบอัดใช้ zlib 1.2.11
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: จำนวนพูล: 1
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: การใช้คำสั่ง SSE2 crc32
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: กำลังเริ่มต้นบัฟเฟอร์พูล ขนาดรวม = 100M อินสแตนซ์ = 1 ขนาดก้อน = 100M
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: การเริ่มต้นของบัฟเฟอร์พูลเสร็จสมบูรณ์
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: กำลังเริ่มต้นการกู้คืนข้อขัดข้องจากจุดตรวจสอบ LSN=7032026737757
2021-11-22 16:26:29 0 [หมายเหตุ] InnoDB: เริ่มชุดสุดท้ายเพื่อกู้คืน 68 หน้าจากบันทึกการทำซ้ำ
[00] 2021-11-22 16:26:30 ไฟล์ binlog ล่าสุด ตำแหน่ง 0
[00] 2021-11-22 16:26:31 เรียบร้อย OK!

C:\Users\Administrator>rem ลบไฟล์ฐานข้อมูล

C:\Users\Administrator>del /q "C:\Program Files\MariaDB 10.3\data\*.*"
\Program ไม่คาดคิดในขณะนี้

C:\Users\Administrator>FOR /D \Program Files\MariaDB 10.3\data\*") DO rmdir "p" /s /q

C:\Users\Administrator>

คำถามของฉัน:

  1. ทำไมข้อความ \Program ไม่คาดคิดในขณะนี้ เมื่อฉันพยายาม del /q "C:\Program Files\MariaDB 10.3\data\*.*"

  2. ทำไมคำสั่งเดิม FOR /D %p IN ("c:\Program Files\MariaDB 10.3\data\*") DO rmdir "%p" /s /q ก็สะท้อนเป็น สำหรับ /D \Program Files\MariaDB 10.3\data\*") DO rmdir "p" /s /q ? ดูเหมือนว่า (แต่ฉันไม่แน่ใจ) อาจเป็นสิ่งที่เกี่ยวข้องกับตัวแปร "%p"

  3. เหตุใดคำสั่งที่เหลือ (นำเข้าข้อมูลสำรอง กู้คืน my.ini และเริ่ม MariaDB) จึงไม่ถูกดำเนินการ

ฉันต้องยอมรับว่าฉันเป็นมือใหม่ใน Windows Scripting และฉันคิดว่าไม่จำเป็นต้องติดตั้ง Python3 แบบเต็มสำหรับสคริปต์เดียวเท่านั้น!

อัปเดต: ฉันพยายาม "ลบไฟล์ฐานข้อมูล" ก่อน "เตรียมการสำรองข้อมูลเพื่อการกู้คืน" แต่ฉันได้ผลลัพธ์เดียวกัน นั่นคือหยุดที่คำสั่ง "สำหรับ"

Score:1
ธง cn

เอาต์พุตสร้างความสับสนเนื่องจากแสดงเอาต์พุตของ FOR ก่อนเสียงสะท้อนของ FOR ดังนั้นดูเหมือนว่าบรรทัดด้านบนจะล้มเหลว แต่ก็ไม่เป็นเช่นนั้น

การแก้ไขนั้นง่ายมาก เพียงเพิ่ม % ตัวแปรของคุณเป็นสองเท่า เช่น...

FOR /D %%p IN ("c:\Program Files\MariaDB 10.3\data\*") DO rmdir "%%p" /s /q

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

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา