إعادة تسمية ملف الدُفعات يجب أن يكون في نفس المجلد

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

  •  05-07-2022
  •  | 
  •  

سؤال

لسبب ما ، يعمل الكود أدناه فقط إذا كان ملف الدُفعات في نفس المجلد مثل الملفات المراد إعادة تسميتها على الرغم من أنني حددت المسار. عندما يكون ملف الدُفعات في مجلد مختلف ، أتلقى خطأً يقول أنه لا يمكن العثور على الملف. أي مدخلات على هذا؟

@echo off&setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
for /f "delims=" %%a in ('dir C:\Users\%username%\Downloads\Export_*.csv /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    SETLOCAL ENABLEDELAYEDEXPANSION
    call set "nname=%%name!counter!%%"
    ren "!fname!" "!nname!%%~xa"
    endlocal
)
هل كانت مفيدة؟

المحلول

فقط أضف مسار العمل:

@echo off&setlocal
set "workingpath=%userprofile%\Downloads"
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
for /f "delims=" %%a in ('dir "%workingpath%\Export_*.csv" /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    SETLOCAL ENABLEDELAYEDEXPANSION
    call set "nname=%%name!counter!%%"
    ren "%workingpath%\!fname!" "!nname!%%~xa"
    endlocal
)

نصائح أخرى

لدى إندورو حل عمل جيد للمشكلة المعلنة. خيار آخر هو ببساطة دفع إلى مكان وجود الملفات. ثم لم تعد بحاجة إلى تضمين المسار في باقي الكود.

نقاط أخرى لا علاقة لها بالسؤال:

ربما يكون من الجيد تهيئة Counter إلى 0 ، فقط في حالة تعيين عملية أخرى بالفعل القيمة على رقم.

أنت لا تحتاج حقا nname عامل.

أفضل نقل قيمة العداد إلى متغير حتى لا أحتاج إلى استخدام بناء المكالمات. (بالنسبة لأولئك الذين لا يعرفون ، فإن تبديل التوسع المتأخر هو الحماية ! الأحرف التي قد تكون في اسم الملف).

@echo off
setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
pushd "C:\Users\%username%\Downloads"
set /a counter=0
for /f "delims=" %%a in ('dir Export_*.csv /b /a-d /o-d') do (
  set "fname=%%~a"
  set /a counter+=1
  setlocal enableDelayedExpansion
  for %%N in (!counter!) do (
    endlocal
    ren "!fname!" "!name%%N!.csv"
  )
)
popd

أخيرًا ، يمكن لـ FindStrstr مع خيار /n التخلص من الحاجة إلى الاتصال أو إضافي

@echo off
setlocal
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
pushd "C:\Users\%username%\Downloads"
for /f "tokens=1* delims=:" %%A in (
  'dir Export_*.csv /b /a-d /o-d ^| findstr /n "^"'
) do (
  set "fname=%%~B"
  setlocal enableDelayedExpansion
  ren "!fname!" "!name%%A!.csv"
  endlocal
)
popd

cbmanica على حق: لا يتم تضمين الدليل في المتغير fname, ، لذلك عليك تحديدها يدويًا في ren يأمر.

@echo off
setlocal ENABLEDELAYEDEXPANSION
set "name1=Bart"
set "name2=Carl"
set "name3=Judy"
set "dir=C:\Users\%username%\Downloads\"
for /f "delims=" %%a in ('dir %dir%Export_*.csv /b /a-d /o-d') do (
    set "fname=%%~a"
    set /a counter+=1
    :: <Comment> In the below line is the use of "call" necessary? </Comment>
    call set "nname=%%name!counter!%%"
    ren "!dir!!fname!" "!dir!!nname!%%~xa"
)
endlocal

يجب أن يفعل ذلك بالضبط ما تريد.

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