كيفية حلقة من خلال ملفات مطابقة البدل في الملف الدفعي

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

سؤال

لدي مجموعة من قاعدة أسماء لكل اسم 'f' هناك نوعان بالضبط الملفات, 'f.في " و " f.خارج'.أريد كتابة ملف دفعي (في نظام التشغيل Windows XP) الذي يذهب من خلال جميع أسماء لكل واحد يجب أن:

  • عرض القاعدة اسم "f"
  • تنفيذ إجراء على 'f.في
  • أداء عمل آخر على 'f.خارج'

ليس لدي أي طريقة إلى قائمة من قاعدة أسماء أخرى بدلا من البحث عن *.في (أو *.الخروج) على سبيل المثال.

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

المحلول

على افتراض لديك برنامجين تلك العملية اثنين من الملفات ، process_in.exe و process_out.exe:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%%~nf هي البديل التعديل ، الذي يوسع %f إلى اسم الملف فقط.نرى معدلات الأخرى في https://technet.microsoft.com/en-us/library/bb490909.aspx (في منتصف الطريق إلى أسفل الصفحة) أو فقط في الإجابة التالية.

نصائح أخرى

يمكنك استخدام هذا الخط طباعة محتويات سطح المكتب الخاص بك:

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

مرة واحدة لديك %%I متغير فإنه من السهل لتنفيذ أمر على أنه (مجرد استبدال كلمة صدى مع البرنامج)

بالإضافة إلى استبدال متغير المراجع وقد تم تعزيز يمكنك الآن استخدام الاختيارية التالية الجملة:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string


[https://ss64.com/nt/syntax-args.html][1]

في الأمثلة أعلاه %I و المسار يمكن أن تحل محلها أخرى صالحة القيم.على %~ بناء الجملة هو إنهاء صالح عن اسم المتغير.اختيار الحالة العلوي أسماء المتغيرات مثل %I يجعلها أكثر قابلية للقراءة ، يتجنب الخلط مع المعدلات التي ليست حساسة لحالة الأحرف.

يمكنك الحصول على كامل الوثائق عن طريق كتابة FOR /?

أسهل طريقة ، كما أرى ، هو استخدام حلقة for أن يدعو الدفعة الثانية ملف للمعالجة ، ويمر الثاني ملف قاعدة الاسم.

وفقا ل /?مساعدة basename يمكن استخراجها باستخدام أنيق ~n الخيار.لذا ، فإن قاعدة السيناريو كالتالي:

for %%f in (*.in) do call process.cmd %%~nf

ثم في العملية.cmd, نفترض أن %0 يحتوي على قاعدة اسم والتصرف وفقا لذلك.على سبيل المثال:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

قد يكون هناك طريقة أفضل للقيام بذلك في برنامج نصي واحد, لكنني كنت دائما قليلا ضبابية حول كيفية سحب أوامر متعددة في واحد حلقة في ملف دفعي.

تحرير:هذا رائع!كنت قد أضاع الصفحة في المستندات التي أظهرت أنه يمكن القيام متعدد الخطوط كتل في حلقة FOR.وانا ذاهب للذهاب إلى العودة وإعادة كتابة بعض الملفات الدفعية الآن...

هناك أداة تستخدم عادة في MS خوادم (بقدر ما أستطيع أن أتذكر) دعا forfiles:

الرابط أعلاه يحتوي على المساعدة وكذلك رابط تحميل microsoft الصفحة.

التوسع في ناتان ما بعد.وفيما يلي سوف نقوم بعمل الكثير في ملف دفعي واحد.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end

رمز أدناه أسماء المرشحات بدءا من إعطاء فرعية.فإنه يمكن تغييرها لتناسب الاحتياجات المختلفة من خلال العمل على subfname فرعية استخراج إذا كان البيان:

echo off
rem filter all files not starting with the prefix 'dat'
setlocal enabledelayedexpansion
FOR /R your-folder-fullpath %%F IN (*.*) DO (
set fname=%%~nF
set subfname=!fname:~0,3!
IF NOT "!subfname!" == "dat" echo "%%F"
)
pause

مرددا f.في f.سوف منفصلة مفهوم ما إلى حلقة ما لا حلقة عند استخدامها في ل /و حلقة.

::Get the files seperated
echo f.in>files_to_pass_through.txt
echo f.out>>files_to_pass_through.txt

for /F %%a in (files_to_pass_through.txt) do (
for /R %%b in (*.*) do (
if "%%a" NEQ "%%b" (
echo %%b>>dont_pass_through_these.txt
)
)
)
::I'm assuming the base name is the whole string "f".
::If I'm right then all the files begin with "f".
::So all you have to do is display "f". right?
::But that would be too easy.
::Let's do this the right way.
for /f %%C in (dont_pass_through_these.txt)
::displays the filename and not the extention
echo %~nC
)

على الرغم من أنك لم تسأل وسيلة جيدة لتمرير الأوامر إلى f.في f.من شأنه أن يكون على...

for /F %%D "tokens=*" in (dont_pass_through_these.txt) do (
for /F %%E in (%%D) do (
start /wait %%E
)
)

رابط جميع Windows XP الأوامر:الرابط

أعتذر إن لم أكن الإجابة على هذا بشكل صحيح.السؤال كان من الصعب جدا بالنسبة لي أن أقرأ.

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