سؤال

أحاول إنجاز المهمة المفضلة للسخرية:

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

C: dir test.txt

ج: windows test2.txt

ج: text3.txt

وأود تعيينها إلى بعض المتغير "A" بحيث:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

سؤال ثانوي هو - ما هو مرجع ملف دفعي جيد؟ أجد بعض الأشياء في مواد Windows، والكثير من المواقع المنزلية المنزلية، ولكن لا شيء كامل بشكل خاص.

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

المحلول

أما بالنسبة للمراجع، SS64.com. ليس سيئا. روب فان دير Woude يحصل مرتبط إلى حد ما في كثير من الأحيان، أيضا.


كما لمشكلتك، هذا سهل:

@echo off
setlocal enableextensions enabledelayedexpansion

set LIST=
for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

echo %LIST%

endlocal

المزيد من التفسير المتعمق:

setlocal enableextensions enabledelayedexpansion

نحن تمكين تأخر التوسع هنا. هذا أمر بالغ الأهمية كما خلاف ذلك لن نتمكن من التعامل مع قائمة الملفات داخل for حلقة التالية.

for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

for /f تكرار فوق خطوط في ملف، لذلك بالضبط ما نحتاجه هنا. في كل تكرار حلقة نلحق بإلحاق السطر التالي LIST عامل. لاحظ استخدام !LIST! بدلا من المعتاد %LIST%. وبعد تأخرت هذه الإشارات التوسع وتضمن إعادة تقييم المتغير في كل مرة يتم تشغيل هذا الأمر.

مستخدم cmd قم بتوسيع المتغيرات إلى قيمها بمجرد قراءة الخط والتحليل. ل cmd خط واحد إما خط أو كل ما العد كخط، يحدث أن يحمل صحيحا لكتلات محددة من بين قوسين مثل الشخص الذي استخدمناه هنا. وذلك ل cmd الكتلة الكاملة هي عبارة واحدة يحصل على القراءة والتحليل مرة واحدة، بغض النظر عن عدد المرات التي يعمل بها الداخلية من الحلقة.

إذا كنا قد استخدمنا %LIST% هنا بدلا من !LIST! ثم كان قد تم استبدال المتغير على الفور من خلال قيمته (فارغة في تلك المرحلة) وسوف تبدو الحلقة مثل هذا:

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

من الواضح أن هذا ليس ما أردنا. التوسع المتأخر يتأكد من توسيع متغير فقط عند حاجة قيمتها بالفعل. في هذه الحالة عندما يعمل الجزء الداخلي من الحلقة ويقوم بإنشاء قائمة بأسماء الملفات.

بعد ذلك المتغير %LIST% أو !LIST! (الآن لا يهم حقا بعد الآن استخدامه) يحتوي على قائمة الخطوط من الملف.

funnily بما فيه الكفاية، والمساعدة ل set يتضمن الأمر هذا المثال بالضبط للتوسع المتأخر:

أخيرا، تمت إضافة دعم التوسع المتغير البيئي المتأخر. يتم تعطيل هذا الدعم دائما بشكل افتراضي، ولكن قد يتم تمكين / تعطيل عبر مفتاح سطر الأوامر / V إلى cmd.exe. انظر cmd /؟

التوسع المتغير البيئي المتأخر مفيد للدخول حول قيود التوسع الحالي الذي يحدث عند قراءة سطر النص، وليس عند تنفيذها. يوضح المثال التالي المشكلة في التوسع المتغير الفوري:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

لن تعرض الرسالة أبدا، نظرا لأن٪ Var٪ في كليهما إذا تم استبدال العبارات عند قراءة العبارة الأولى، لأنها تتضمن منطقيا جسم ما إذا كان، وهو عبارة مركبة. لذلك إذا كان داخل العبارة المركبة تقارن حقا "قبل" مع "بعد" والتي لن تكون متساوية أبدا. وبالمثل، لن يعمل المثال التالي كما هو متوقع:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

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

for %i in (*) do set LIST= %i

ما الذي يحتفظ فقط بإعداد قائمة على الملف الأخير الموجود.

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

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

نصائح أخرى

ما كنت بعد أن يتم ذلك مع ل / f الأوامر.

إليك مورد جيد استخدمته عدة مرات:

http://www.robvanderwoude.com/batchfiles.php.

كتاب جيد: Windows NT SHELL SCRIPTING by Tim Hill. تم نشر الطبعة في عام 1998 ولكنها لا تزال صالحة لبرامج أوامر Windows في نظام التشغيل Windows 2008.

type *commonfilepart* >> concat_result_file

نظام التشغيل: Windows Server 2003

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