สคริปต์ DOS เพื่อใช้ชื่อไฟล์และเส้นทางแบบไดนามิกตามวันที่

ฉันต้องเขียนสคริปต์แบตช์/ดอสใน windows ซึ่งจะวางไฟล์ในกล่อง UNIX แต่เส้นทางและชื่อไฟล์มีการเปลี่ยนแปลงทุกปีและเดือนตามลำดับใน windows

สมมติว่าไดเร็กทอรีใน windows ที่พาธ C:/2009MICS ซึ่งจะเก็บไฟล์ไว้ตลอดทั้งปี (12 ไฟล์) แบทช์ของฉันจะทำงานทุกเดือนและควรเลือกไฟล์สำหรับเดือนที่เกี่ยวข้องเท่านั้น เช่น หากแบตช์ของฉันกำลังทำงานในเดือนกุมภาพันธ์ 09 ควรเลือกและถ่ายโอนไฟล์สำหรับเดือนกุมภาพันธ์จากโฟลเดอร์ 2009MICS


person Community    schedule 05.02.2009    source แหล่งที่มา


คำตอบ (3)


copy "%date:~6%.txt" "\path\to\destination"

จะคัดลอก 2009.txt ไปยังเส้นทางปลายทาง หากต้องการรวมเดือน ให้ใช้

copy "%date:~3%.txt" "\path\to\destination"

ข้อจำกัดความรับผิดชอบ - ฉันทดสอบแล้วว่าใน Win Vista ฉบับภาษาเยอรมัน หวังว่ามันจะใช้ได้กับรุ่น International เช่นกัน

person Phil Reif    schedule 05.02.2009
comment
นั่นไม่เกี่ยวอะไรกับภาษาของ OS มากกว่ากับภาษาที่ตั้งไว้ สิ่งที่วันที่/เวลาใน cmd นั้นเปราะบางโดยเนื้อแท้เนื่องจากคุณจะได้รับเฉพาะวันที่ที่แปลเป็นภาษาท้องถิ่นแทนที่จะเป็นวันที่เป็นกลางทางวัฒนธรรม สำหรับฉัน การใช้วันที่มาตรฐาน ISO 8601 (ปปปป-ดด-วว) มันจะใช้งานไม่ได้ แต่ฉันยังไม่พบวิธีแก้ปัญหาที่ดีกว่านี้ คุณเพียงแค่ต้องระวังว่ามันใช้ไม่ได้กับรูปแบบวันที่ที่แตกต่างกัน - person Joey; 28.04.2009

วิธีหนึ่งคือการดึงวันที่ปัจจุบันเข้าสู่สภาพแวดล้อมที่มี GetDate.cmd (ตอนท้าย) จากนั้นคุณสามารถเปรียบเทียบตัวแปร %mm% (เดือนปัจจุบัน) กับเดือนของการประทับวันที่ของไฟล์กับสิ่งนี้:

  @echo off
  :: see http://ss64.com/nt/syntax-args.html
  for %%f in (*.bat) do (
     echo.
     echo Parameter '~tf' reports '%%~tf' for '%%f'

     :: see http://ss64.com/nt/for_f.html
     echo.
     for /f "tokens=1-2" %%g in ("%%~tf") do (
        echo the file date %%g
        echo the file time %%h
        )

     for /f "tokens=1-3 delims=- " %%i in ("%%~tf") do (
        echo the year     %%i
        echo the month    %%j
        echo the day      %%k
        )

     )

ผลลัพธ์:

  Parameter '~tf' reports '2009-08-28 11:52 AM' for 'test-date.bat'

  the file date 2009-08-28
  the file time 11:52
  the year     2009
  the month    08
  the day      28

คุณสามารถใช้โครงสร้างโทเค็นที่คล้ายกันเพื่อแยกวันที่ออกจากชื่อไฟล์ได้ หากการประทับวันที่ไม่น่าเชื่อถือ/ใช้งาน

  ::GetDate.cmd - Source: http://ss64.com/nt/syntax-getdate.html :
  @echo off
  SETLOCAL
  FOR /f "tokens=1-4 delims=/-. " %%G IN ('date /t') DO (call :s_fixdate %%G %%H %%I %%J)
  goto :s_print_the_date

  :s_fixdate
  if "%1:~0,1%" GTR "9" shift
  FOR /f "skip=1 tokens=2-4 delims=(-)" %%G IN ('echo.^|date') DO (
      set %%G=%1&set %%H=%2&set %%I=%3)
  goto :eof

  :s_print_the_date
  echo Month:[%mm%]  Day:[%dd%]  Year:[%yy%]
  ENDLOCAL
  SET mm=%mm%&SET dd=%dd%&SET yy=%yy%

อ่านเพิ่มเติม:

http://ss64.com/nt/syntax-getdate.html - วันที่ส่งคืน ในสภาพแวดล้อมที่ไม่ขึ้นกับการตั้งค่าวันที่ในระดับภูมิภาค http://ss64.com/nt/syntax-datemath.html - เพิ่มหรือลบวันจากวันที่ใดๆ http://ss64.com/nt/syntax-delolder.html - ลบไฟล์ที่เก่ากว่า N วันออกจากโฟลเดอร์เดียว

person Community    schedule 28.08.2009

ฉันเห็นสองวิธีที่แตกต่างกันในการตีความสิ่งที่คุณถาม ..

วันที่ขับเคลื่อนโดยวันที่คุณเรียกใช้สคริปต์ ดังนั้นจริงๆ แล้วใช้วันที่ของระบบ หรือขับเคลื่อนโดยวันที่ไฟล์ของไฟล์ที่จะคัดลอก

Phil มีข้อดี แต่การล็อกกระบวนการออกเดทให้เป็นวันที่ปัจจุบันจะทำให้คุณโชคร้าย หากคุณไม่เปิดใช้งานสคริปต์ในวันที่ที่กำหนด และพยายามดำเนินการในภายหลัง เช่น วันที่ 1 มีนาคม

สำหรับส่วนของไฟล์ ฉันจะทำสิ่งต่อไปนี้:

@echo off
setlocal ENABLEDELAYEDEXPANSION
pushd C:\2009MICS
for /F "delims=" %%f in ('dir /b /a-d') do (
    for /f "tokens=2 delims=- " %%t in ("%%~tf") do set TimeStamp=%%t
    if not exist !TimeStamp!\ mkdir !TimeStamp!\
    copy %%f !TimeStamp!\ >nul
)
exit /b

ฉันหวังว่าฉันจะตอบคำถามถูก ไม่อย่างนั้นก็เริ่มต้นที่นี่ :)

person Jay    schedule 20.08.2009