نقل عدد كبير من الملفات في دليل واحد إلى أدلة متعددة

StackOverflow https://stackoverflow.com/questions/2541887

  •  23-09-2019
  •  | 
  •  

سؤال

أتطلع إلى إنشاء برنامج نصي مدفوعة Windows لنقل حوالي 2000 ملف وتقسيمها بحيث يكون هناك 10 ملفات لكل مجلد. لقد حاولت إنشاء برنامج نصي دفعة ولكن بناء الجملة يحير حقًا ذهني. هذا ما لدي حتى الآن

@echo off

:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1

for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
    md folder%nf%
    set /a n += 1
)

:: move file into folder
mv -Y %%f folder%nf%\%%f

:: reset counter if larger than group size
if %n% == %groupsize% (
    set /a n = 1
) else (
    set /a n += 1
)
)
pause

في الأساس ما يفعله هذا البرنامج النصي هو حلقة كل ملف .txt في الدليل. إنه ينشئ دليلًا جديدًا في البداية ويقوم بنقل 10 ملفات إلى هذا الدليل ، ثم ينشئ مجلد جديد مرة أخرى ويقوم بنقل 10 ملفات أخرى إلى هذا الدليل ، وهكذا. ومع ذلك ، أواجه مشاكل حيث n لا يتم زيادة المتغير في الحلقة؟ أنا متأكد من أن هناك أخطاء أخرى أيضًا لأن نافذة CMD تغلق علي حتى مع pause. يتم تقدير أي مساعدة أو إرشادات ، شكرًا على وقتك!

هل كانت مفيدة؟

المحلول

بعض الأشياء التي تحتاج إلى معرفتها:

  • SETLOCAL ENABLEDELAYEDEXPANSION هناك حاجة ، نظرًا لأنك تقوم بتغيير المتغيرات واستخدام قيمها المتغيرة في كتلة أقواس واحدة. SET /? على سطر الأوامر سوف يعطي بعض المعلومات. ابحث في الإنترنت عن هذا المصطلح وستجد تفسيرًا أفضل.
  • الأماكن التي استخدمها !nf! يرتبط تنسيق المتغيرات بتأخير التوسع.
  • كما ذكر Ghostdog74 ، لم تكن تتزايد %nf%.
  • لقد طالبت nf إلى 0 بدلاً من 1. بهذه الطريقة ، فإن رقم المجلد الذي تريد نقل الملفات إليه هو نفس رقم المجلد الذي أنشأته للتو. في التعليمات البرمجية الخاصة بك ، يمكنك إنشاء FOLDERX ، ثم زيادة x ، ثم حاول نقل الملف إلى x+1.
  • عليك أن تستخدم MOVE لنقل ملف ، MV غير صالح.

يعمل ملف الدُفعات هذا ... ولكن تأكد من اختبارك! لقد اختبرت فقط على كمية صغيرة من الملفات.

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0

FOR %%f IN (*.txt) DO (
  :: if counter is 1, create new folder
  IF !n!==1 (
    SET /A nf+=1
    MD folder!nf!
  )

  :: move file into folder
  MOVE /Y "%%f" folder!nf!

  :: reset counter if larger than group size
  IF !n!==!groupsize! (
    SET n=1
  ) ELSE (
    SET /A n+=1
  )
)

ENDLOCAL

PAUSE

نصائح أخرى

أنت لا تتزايد %nf%.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top