การซิปไฟล์ตามชื่อไฟล์


0

ทุกวันเราได้รับห้าไฟล์ดังนี้:

vi_250000364846.dqa_report.xlsx
vi_250000364846.3553_report
vi_250000364846.MSR_report
vi_250000364857.3553_report
vi_250000364857.dqa_report.xlsx

หมายเลขในชื่อไฟล์แตกต่างกันในแต่ละวัน แต่จะเหมือนกันสำหรับสามไฟล์ที่ต้องการ ฉันต้องส่งไฟล์ทั้งสามไปที่โฟลเดอร์ zip ที่ถูกบีบอัดเท่านั้น

ฉันเขียนโค้ดต่อไปนี้ แต่ใช้ไฟล์แรกหลายครั้งและแสดงค่าเดียวกันห้าครั้ง:

@echo on  
set LOGFILE=batch.log  
call :LOG > %LOGFILE%  
exit /B  

:LOG  
setlocal EnableDelayedExpansion  
set n=0  
set count=0  
set vector[%n%]=0  
for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  
set filename=%%i  
for /f "tokens=2 delims=_." %%a in ("%filename%") do (  
   set vector[!n!]=%%a  
  for /f "tokens=* delims==" %%v in ('set vector[%n%]')  do @echo %%v  
)  
 set /A n+=1  
)

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

โปรดช่วยฉันค้นหาว่ามันเกิดอะไรขึ้น


ทั้งจากรหัสของคุณหรือจากคำอธิบายก็เป็นที่ชัดเจนว่าสิ่งที่ 3 ไฟล์ที่คุณต้องการซิป ครั้งแรกที่for /fดูเหมือนว่าไม่จำเป็นในขณะที่คุณเพียงแค่ใช้มันเพื่อระบุไฟล์และคนที่ 3 ถูกวางผิดที่; มันควรจะอยู่ด้านนอกของ oter สำหรับ / f
LotPings

คำตอบ:


0

คุณมีสถานที่สองแห่งที่คุณใช้การขยายความกระตือรือร้น (พร้อม%ตัวคั่น) ซึ่งคุณควรใช้การขยายที่ล่าช้า (พร้อม!ตัวคั่น) การแก้ไขที่ดูเหมือนจะทำให้เกิดพฤติกรรมที่คุณต้องการ:

@echo on  
set LOGFILE=batch.log  
call :LOG > %LOGFILE%  
exit /B  

:LOG  
setlocal EnableDelayedExpansion  
set n=0  
set count=0  
set vector[%n%]=0  
for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  
set filename=%%i  
for /f "tokens=2 delims=_." %%a in ("!filename!") do (  
   set vector[!n!]=%%a  
  for /f "tokens=* delims==" %%v in ('set vector[!n!]')  do @echo %%v  
)  
 set /A n+=1  
)

เพื่อให้ชัดเจนการเปลี่ยนแปลงที่ฉันทำคือ:

for /f "tokens=2 delims=_." %%a in ("%filename%") do (  

เปลี่ยนไปเป็น:

for /f "tokens=2 delims=_." %%a in ("!filename!") do (  

และ:

for /f "tokens=* delims==" %%v in ('set vector[%n%]')  do @echo %%v  

เปลี่ยนไปเป็น:

for /f "tokens=* delims==" %%v in ('set vector[!n!]')  do @echo %%v  

หากไม่มีการเปลี่ยนแปลงเหล่านั้น%filename%จะขยายเป็นสตริงว่าง%n%เสมอและขยายเป็น 0 เสมอ (ค่าที่ตั้งไว้เมื่อforเริ่มต้นด้านนอก); ในกรณีหลังสิ่งนี้จะทำให้เสียเอาต์พุตของคุณเท่านั้น (คุณใช้อย่างถูกต้อง!n!เมื่อกำหนดให้vectorดังนั้นจึงมีค่าที่ถูกต้องเป็นเพียงคุณพิมพ์รายการแรกเท่านั้นแม้ว่าคุณจะเพิ่มรายการในดัชนีที่ตามมา)

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