พร้อมรับคำสั่งให้คัดลอกเฉพาะรูปภาพจากโฟลเดอร์และโฟลเดอร์ย่อย

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

เมื่อดำเนินการไฟล์ .bat รูปภาพทั้งหมดจากโฟลเดอร์และโฟลเดอร์ย่อยจะถูกคัดลอกไปยังตำแหน่งของฉันบนเดสก์ท็อป

ตัวอย่าง: โฟลเดอร์ต้นฉบับอยู่ที่: \intranet\file_location\PP Complete Images (ในโฟลเดอร์นี้จะมีโฟลเดอร์อื่นโหลดอยู่ และในโฟลเดอร์เหล่านั้นจะมีรูปภาพ .jpg)

ไฟล์ปลายทางจะขึ้นอยู่กับเดสก์ท็อป

ดังนั้นฉันจึงต้องแยกรูปภาพ .jpg ออกจากโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมด

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

หรือฉันควรมองหาซอฟต์แวร์เพื่อทำสิ่งนี้ให้ฉัน?

รหัสที่มีอยู่:

cd c: 
cd\ 
copy "\\intranet\PP Complete Images\Master Image Folder*.jpg" "C:\Users\username\Desktop\Master Image Folder" 
copy "\\intranet\PP Complete Images*.jpg" 
exit

comment
คุณได้เขียนโค้ดใด ๆ ที่คุณสามารถแบ่งปันได้หรือไม่?   -  person Fred    schedule 17.11.2014
comment
ได้ แต่จะคัดลอกเฉพาะในกรณีที่ไฟล์ .jpg อยู่ในโฟลเดอร์เดียว: cd c: cd\ copy \\intranet\PP Complete Images\Master Image Folder*.jpg C:\Users\username\Desktop\Master Image Folder copy \\ อินทราเน็ต\PP รูปภาพที่สมบูรณ์*.jpg ทางออก   -  person Freedox    schedule 17.11.2014


คำตอบ (4)


รหัสที่มีอยู่ของคุณ:

cd c: ไม่ถูกต้อง หากต้องการเปลี่ยนไดรฟ์ปัจจุบันเป็น c: ให้ใช้

c:

cd \ ซ้ำซ้อน รหัสที่เหลือของคุณจะระบุไดเร็กทอรี ดังนั้นไดเร็กทอรีปัจจุบันจึงไม่เกี่ยวข้อง

คำสั่ง copy คำสั่งแรกของคุณมีปัญหาสามประการ Master Image Folder*.jpg หมายถึงชื่อไฟล์ทั้งหมดที่ขึ้นต้นด้วย Master Image Folder และลงท้ายด้วย .jpg คุณอาจหมายถึง Master Image Folder\*.jpg หมายถึงไฟล์ทั้งหมดที่ลงท้ายด้วย .jpg ด้วย ...\Master Image Folder\

C:\Users\username\Deskto... อาจเป็นข้อผิดพลาด มันเป็นเส้นทางตามตัวอักษร ดังนั้นไดเร็กทอรีที่แท้จริงจะเป็น C:\Users\username\Deskto... คุณอาจต้องใช้ C:\Users\%username%\Deskto... เพื่อทดแทนใน username ปัจจุบัน

จากนั้นงานจะหยุดที่การจับคู่ชื่อไฟล์ ดังนั้นคุณจะกด A เพื่อเขียนทับทั้งหมด หรือกด y หรือ n สำหรับการจับคู่ชื่อแต่ละรายการ

คำสั่ง copy สุดท้ายของคุณไม่มีไดเร็กทอรีปลายทางที่ระบุ

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

วิธีแก้ปัญหาที่ง่ายที่สุดน่าจะเป็นการใช้

xcopy /d /y /s "\\intranet\PP Complete Images\Master Image Folder\*.jpg" "C:\Users\%username%\Desktop\Master Image Folder\" 

ซึ่งจะคัดลอกไฟล์ที่อัปเดต (/d) ด้วยการเขียนทับอัตโนมัติ (/y) และการสแกนไดเรกทอรีย่อย (/s) จากชื่อ/มาสก์ไปยังไดเรกทอรี

สิ่งนี้จะสร้างลำดับชั้นไดเรกทอรีที่เหมือนกันให้กับทรีย่อยดั้งเดิมภายใต้ไดเร็กทอรี Master Image Folder ของ destop

คุณสามารถขยายสิ่งนี้ไปที่

for %%a in (
 "\\intranet\PP Complete Images\Master Image Folder"
 "\\intranet\wherever\somewhere"
) do xcopy /d /y /s "%~a\*.jpg" "C:\Users\%username%\Desktop\Master Image Folder\"

เพื่อดำเนินการเดียวกันกับหลายไดเร็กทอรีย่อย แต่คุณต้องแน่ใจว่าไดเร็กทอรีปลายทางไม่อยู่ในแผนผังย่อยที่เลือกเพื่อรวมไว้ในรายการภายในวงเล็บ

ฉันขอแนะนำไม่ให้ "แบน" เอาต์พุตเพราะถ้าคุณทำเช่นนั้น สิ่งใดก็ตาม.jpg ล่าสุดจากแผนผังย่อยแต่ละรายการจะจบลงที่ไดเร็กทอรีปลายทางของคุณ โดยไม่มีการแจ้งเตือนว่าอาจมี < em>อะไรก็ได้.jpg เวอร์ชัน

person Magoo    schedule 17.11.2014
comment
ประเด็นก็คือรูปภาพทั้งหมดในโฟลเดอร์และโฟลเดอร์ย่อยไม่ซ้ำกัน ดังนั้นฉันจึงไม่ต้องกังวลกับการทำซ้ำรูปภาพเหล่านั้น... ปัญหาคือฉันไม่สามารถเรียกใช้ไฟล์แบตช์ในโฟลเดอร์ที่แชร์ได้ ดังนั้นจึงต้องเป็นเครื่องของฉัน... - person Freedox; 18.11.2014
comment
ฉันได้รวมโค้ดไว้ดังนี้: @ECHO OFF for /r %%f in (\\intranet\PP Complete Images) do call:copyFile %%f GOTO END :copyFile copy /V %~1 C:\Users\username\ Desktop\test GOTO:EOF :END แต่ฉันต้องดึงเฉพาะไฟล์ .jpg และจริง ๆ แล้วมันกำลังดึงทุกอย่างและดึงเพียง 24 รายการจาก 40k+ รูปภาพ - person Freedox; 18.11.2014

คุณต้องการมันอย่างไร?

ฉันไม่ชัดเจนนักว่าผลลัพธ์ควรเป็นอย่างไร - ควร แบนราบ หรือควรเป็นแบบลำดับชั้นด้วย

ดูตัวอย่างนี้:

source
    folder-1
        folder-1-1
            image1.jpg
        folder-1-2
            image2.jpg
            cheese.jpg
        image3.jpg
        some_text.txt
    folder-2
        folder-2-1
            image3.jpg
        some_music.mp3
    cheese.jpg
target

ผลลัพธ์ควรเป็นสำเนาของลำดับชั้นที่แสดง (โดยไม่มีไฟล์อื่นใดนอกจาก jpgs) หรือควรเป็นผลลัพธ์ flattened เช่นนี้:

source
    ... (see above)
target
    image1.jpg
    image2.jpg
    cheese.jpg
    image3.jpg
    image3.jpg

คุณจะทำอย่างไร?

แบน

คุณสามารถใช้คำสั่ง for ของ DOS เพื่อเดินไดเรกทอรี1 และสร้างฟังก์ชันที่กำหนดเอง2 เพื่อจัดการไฟล์:

@ECHO OFF
for /r %%f in (*.jpg) do call:copyFile %%f
GOTO END

:copyFile
copy /V /-Y %~1 ..\target
GOTO:EOF

:END

ความหมาย: for ทุก ๆ %%f ในรายการ *.jpg จาก dir การทำงานปัจจุบัน ให้ดำเนินการฟังก์ชัน copyFile สวิตช์ /r ทำให้รายการเกิดซ้ำ (เดินผ่านไดเร็กทอรีย่อยทั้งหมด)

ในฟังก์ชันนี้ อาร์กิวเมนต์ที่ส่งผ่านไป (ปัจจุบันเรียกว่า %~1) จะถูกส่งผ่านไปยังฟังก์ชันคัดลอก: คัดลอกไฟล์ไปยังไดเร็กทอรีเป้าหมายซึ่งในกรณีนี้คือ ..\target /V ให้คัดลอกตรวจสอบผลลัพธ์ /-Y ให้ขออนุญาตเขียนทับไฟล์ ดู copy /?!

ปัญหาใหญ่มาก: หากคุณมีไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไปในโฟลเดอร์ย่อยที่แตกต่างกันของไดเรกทอรีต้นทางซึ่งมีชื่อเดียวกัน (เช่น cheese.jpgs สองไฟล์ในตัวอย่างของฉัน) คุณจะสูญเสียข้อมูล!< /แข็งแกร่ง>

ดังนั้น ฉันไม่แนะนำวิธีนี้ เนื่องจากคุณอาจเสี่ยงต่อการสูญเสียข้อมูล (กล้องดิจิตอลไม่ค่อยสร้างสรรค์ในการตั้งชื่อรูปภาพ!)

ลำดับชั้น

เพียงใช้ robocopy:

robocopy /S <sourcedir> <targetdir> *.jpg

/S สร้างและคัดลอกโฟลเดอร์ย่อยด้วย คุณยังสามารถใช้ /DCOPY:T เพื่อทำให้ไดเร็กทอรีมีการประทับเวลาเหมือนกันกับไดเร็กทอรีดั้งเดิม หรือ /L เพื่อดูตัวอย่างการทำงานของ robocopy

ปัญหาเล็กๆ: สวิตช์ /E จัดการโฟลเดอร์ย่อยด้วย แม้ว่าจะว่างเปล่าก็ตาม /S จัดการโฟลเดอร์ย่อยด้วยเช่นกัน แต่จะไม่จัดการหากโฟลเดอร์เหล่านั้นว่างเปล่า แต่ มันจะจัดการมัน หากมันไม่ว่างเปล่า แต่ไม่มี JPG อยู่ข้างใน ดังนั้น โฟลเดอร์ย่อยที่ไม่มี JPG จะส่งผลให้โฟลเดอร์ว่างในโฟลเดอร์เป้าหมาย

Robocopy มีพารามิเตอร์มากมาย ดังนั้นลองดู robocopy /?

หวังว่านี่จะช่วยได้! :-)


1พบได้ที่นี่: จะสำรวจแผนผังโฟลเดอร์/ทรีย่อยในไฟล์แบตช์ Windows ได้อย่างไร
2พบได้ที่นี่: http://www.dostips.com/DtTutoFunctionsphp

person Kurtibert    schedule 17.11.2014
comment
ฉันกำลังมองหาโซลูชันแบบเรียบๆ และสคริปต์นั้นใช้งานได้ดีกับโซลูชันเดียว แต่... ฉันไม่สามารถ 'เรียกใช้ไฟล์แบตช์บนอินทราเน็ตที่แชร์ได้ ดังนั้นฉันจึงต้องมีลิงก์ต้นทางไปยังโฟลเดอร์เดียวที่จะดึงรูปภาพออกมา - person Freedox; 18.11.2014
comment
คุณใช้ net use Y: \\intranet\PP Complete Images\ ไม่ได้เหรอ? จากนั้นคุณสามารถเข้าถึงการแชร์ผ่านอักษรระบุไดรฟ์ Y: - person Kurtibert; 18.11.2014
comment
นี่คือไดรฟ์ย่อยภายในบริษัท นี่คือลิงก์ที่ฉันใช้เข้าถึงโฟลเดอร์ทั้งหมดในปลายทาง: \\btbnas\PP Complete Images - person Freedox; 18.11.2014
comment
แต่ฉันสามารถระบุปลายทางนั้นได้หรือไม่ ish shared foler + ฉันต้องการไฟล์ *.jpg เท่านั้น - person Freedox; 18.11.2014
comment
คำสั่ง for ค้นหาองค์ประกอบทั้งหมดจากไดเร็กทอรีการทำงานปัจจุบัน ดังนั้น คุณสามารถใช้ net use Y: \\intranet\PP Complete Images\ เพื่อแมป Y: กับการแชร์ของคุณได้ หลังจากนั้น คำสั่ง Y: จะเปลี่ยนไดเร็กทอรีการทำงานเป็นการแชร์ของคุณ - person Kurtibert; 18.11.2014

ฉันเชื่อว่าวิธีแก้ปัญหาของคุณคือ Robocopy Robocopy นั้นยอดเยี่ยมมาก!

นี่คือไวยากรณ์ของ robocopy-

robocopy [แหล่งที่มา] [ปลายทาง] [ไฟล์] [...] [ตัวเลือก]

แหล่งที่มา ระบุโฟลเดอร์ต้นทาง ที่คุณต้องการนำไฟล์มาจากไหน

ปลายทาง ไดเรกทอรี/โฟลเดอร์ปลายทาง

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

robocopy *.jpg c:\destinationdir /S /MAX:1048576

*หากต้องการรัน .bat ทุกเช้า ให้ไปที่โปรแกรมชื่อ Task Scheduler ไม่ต้องกังวล เนื่องจากโปรแกรมมีอยู่ใน Windows http://windows.microsoft.com/en-US/windows/schedule-task#1TC=windows-7

*จากนั้นคลิกที่สร้างงานพื้นฐาน และตั้งค่างานของคุณเมื่อใดก็ตามที่คุณต้องการ!

person Pringles    schedule 17.11.2014

ขอบคุณพวกคุณสำหรับความช่วยเหลือของคุณ!!!

ฉันแก้ไขได้แล้วและมีโค้ดด้านล่างหากมีใครต้องการสิ่งที่คล้ายกัน:

    pushd Z:\intranet\PP Complete Images\
   for /r %%a in (*.jpg) do (
      XCOPY /Y "%%a" "C:\Users\username\Desktop\Master Image Folder"
   )
popd
person Freedox    schedule 20.11.2014