ฉันได้สร้างสคริปต์ค้างคาว Windows เพื่อเก็บไฟล์เก่าจากรายการ ข้อเสนอแนะใด ๆ สำหรับไวยากรณ์ในโค้ด?

ไม่แน่ใจว่า setlocal มีไว้เพื่ออะไร แต่ฉันพบมันในตัวอย่างสคริปต์สำหรับอย่างอื่นที่ต้องใช้หลายคำสั่งใน for loop

Filelist.txt เก็บรายการไฟล์ที่มีเส้นทางไฟล์แบบเต็มเพื่อแชร์

ตัวอย่างเช่น: \\FileShare\Division\Project\file.txt

setlocal enabledelayedexpansion
for /f "delims=" %%i in (filelist.txt) do (
mkdir "D:\Archive\%%~dpi"
move "%%i" "D:\Archive\%%i")
endlocal

สคริปต์รับไฟล์ใน filelist.txt (ทีละบรรทัด) และคัดลอกโครงสร้างไดเร็กทอรีของพาธ จากนั้นย้ายไฟล์ไปทับ การใช้ตัวอย่างด้านบนจะสร้างไดเร็กทอรี D:\Archive\FileShare\Division\Project\ จากนั้นย้ายไฟล์ file.txt ไปยังไดเร็กทอรีนั้น

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

แก้ไข: เพื่อแสดงความคิดเห็นจากจะด้านล่าง สคริปต์ถูกสร้างขึ้นเพื่อทำงานกับรายงานที่สร้างไฟล์ที่ไม่มีการเข้าถึงมานานกว่าหนึ่งปี นี่คือสาเหตุที่จำเป็นต้องแก้ไขรายการไฟล์เนื่องจากฉันต้องการรักษาโครงสร้างโฟลเดอร์และไฟล์อื่นๆ ทั้งหมดให้ครบถ้วน หากมีวิธีใดที่จะรวมสิ่งนี้เข้ากับสคริปต์ได้คงจะยอดเยี่ยมมาก!


person Tetsuya    schedule 10.01.2013    source แหล่งที่มา
comment
สำหรับแอปพลิเคชันของคุณ คุณควรคัดลอกไฟล์/โฟลเดอร์ทั้งหมดที่นำมาจากรายการไดเร็กทอรี แทนที่จะต้องแสดงรายการทุกไฟล์ที่คุณต้องการเก็บถาวรหรือไม่   -  person will    schedule 10.01.2013
comment
@will สคริปต์นี้ใช้งานได้กับรายการที่สร้างโดยรายงาน รายงานนี้จัดทำขึ้นสำหรับไฟล์ทั้งหมดที่ไม่มีการเข้าถึงในปีที่ผ่านมาหรือนานกว่านั้น จะมีวิธีรวมสิ่งนั้นเข้ากับสคริปต์หรือไม่?   -  person Tetsuya    schedule 10.01.2013


คำตอบ (1)


คุณไม่จำเป็นต้องมี delayed expansion หรือ setlocal setlocal จะแยกขอบเขตของส่วนเพื่อให้การเปลี่ยนแปลงใดๆ ที่ทำกับตัวแปรถูกแยกออกจากขอบเขตนั้น การขยายแบบหน่วงเวลาจำเป็นเฉพาะในกรณีที่คุณกำลังขยายตัวแปรภายในลูปหรือคำสั่ง if ไม่มีอะไรให้ล้างสคริปต์ของคุณมากนัก ถ้ามันบรรลุภารกิจของคุณโดยไม่มีปัญหาและมีประสิทธิภาพขนาดนั้น ก็ไม่จำเป็นต้องเปลี่ยนแปลง

การเปลี่ยนแปลงและเหตุผล

  1. setlocal EnableExtensions ไม่จำเป็นต้องแยกขอบเขต แต่ต้องเปิดใช้งานส่วนขยายเพื่อใช้ตัวเลือก for /f
  2. %%F แทนที่จะเป็น %%i เนื่องจากตัวพิมพ์ใหญ่แตกต่างจากตัวแก้ไขได้ง่ายกว่า (ความสามารถในการอ่าน)
  3. if exist "%%~fA" เพื่อตรวจสอบว่าไฟล์ในรายการยังคงมีอยู่เมื่อเรียกใช้สคริปต์
  4. for /f "tokens=1 delims=:" %%D in ("%%~dF") do เนื่องจากชื่อโฟลเดอร์ไม่สามารถมีโคลอนได้ วิธีนี้จะลบอักขระโคลอนออกจากเส้นทางไฟล์สำหรับไดรฟ์
  5. && ลองย้ายไฟล์เฉพาะเมื่อบรรจุปลายทางสำเร็จแล้ว

รหัส:

rem Hide the Command Output.
@echo off
rem Isolate Variable Scope and Enable Extensions.
setlocal EnableExtensions
rem Loop through the file list and verify file existence.
for /f "delims=" %%F in (filelist.txt) do if exist "%%~fF" (
    rem Parse the drive letter since colon : is not a valid folder character.
    for /f "tokens=1 delims=:" %%D in ("%%~dF") do (
        rem Create the folder hierarchy
        mkdir "D:\Archive\%%~D\%%~pF" && move "%%~fF" "D:\Archive\%%~D\%%~pF"
    )
)
endlocal
person David Ruhmann    schedule 10.01.2013
comment
ขอบคุณเดวิด! ฉันสงสัยว่าจะได้สิ่งนั้นมาได้อย่างไร: ลบแล้ว ฟังดูเป็นรายการที่ดี ฉันจะลองดูและปรับเปลี่ยนตาม - person Tetsuya; 12.01.2013