كيف يمكنني تحميل محتويات ملف نصي إلى متغير ملف دفعي؟

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

سؤال

أحتاج إلى أن أكون قادرًا على تحميل محتويات الملف النصي بالكامل وتحميله في متغير لمزيد من المعالجة.

كيف أقوم بذلك؟


إليك ما فعلته بفضل إجابة رومان أوديسكي.

SetLocal EnableDelayedExpansion
set content=
for /F "delims=" %%i in (test.txt) do set content=!content! %%i

echo %content%
EndLocal
هل كانت مفيدة؟

المحلول

يستخدم for, ، شيء على غرار:

set content=
for /f "delims=" %%i in ('filename') do set content=%content% %%i

ربما عليك أن تفعل setlocal enabledelayedexpansion و/أو الاستخدام !content! بدلا من %content%.لا يمكنني إجراء الاختبار، لأنه ليس لدي أي برنامج MS Windows قريب (وأتمنى لك نفس الشيء :-).

أفضل مرجع للملف الدفعي للسحر الأسود الذي أعرفه موجود في http://www.rsdn.ru/article/winshell/batanyca.xml.إذا كنت لا تعرف اللغة الروسية، فلا يزال بإمكانك الاستفادة من مقتطفات الشفرة المتوفرة.

نصائح أخرى

إذا كان أمر set الخاص بك يدعم رمز التبديل /p، فيمكنك توجيه الإدخال بهذه الطريقة.

set /p VAR1=<test.txt

تعيين /؟|ابحث عن "/ ف"

يتيح لك مفتاح /p تعيين قيمة المتغير على سطر من الإدخال الذي أدخله المستخدم.يعرض البروبس المحدد قبل قراءة سطر الإدخال.يمكن أن تكون سلسلة المطالبة فارغة.

وهذا له فائدة إضافية تتمثل في العمل مع أنواع الملفات غير المسجلة (وهو ما لا تفعله الإجابة المقبولة).

يمكنك استخدام:

set content=
for /f "delims=" %%i in ('type text.txt') do set content=!content! %%i

هل يمكنك تحديد مزيد من المعالجة؟

يمكنك استخدام حلقة for للقيام بذلك تقريبًا، ولكن لا توجد طريقة سهلة لإدراج CR/LF في متغير بيئة، لذلك سيكون لديك كل شيء في سطر واحد.(قد تتمكن من حل هذه المشكلة اعتمادًا على ما تحتاج إلى القيام به.)

أنت مقيد أيضًا بأقل من حوالي 8 كيلو من الملفات النصية بهذه الطريقة.(لا يمكنك إنشاء env var واحد أكبر من حوالي 8 كيلو بايت.)

ربما يكون اقتراح بيل بشأن حلقة for هو ما تحتاجه.تقوم بمعالجة الملف سطرًا واحدًا في كل مرة:

(يستخدم %i في سطر الأوامر %%i في ملف دفعي)

for /f "tokens=1 delims=" %%i in (file.txt) do echo %%i

أكثر تطورا:

for /f "tokens=1 delims=" %%i in (file.txt) do call :part2 %%i
goto :fin

:part2
echo %1
::do further processing here
goto :eof

:fin

قم بإنشاء ملف يسمى "SetFile.bat" الذي يحتوي على السطر التالي مع لا عودة النقل في نهايتها...

set FileContents=

ثم في الملف الدفعي الخاص بك افعل شيئًا كهذا ...

   @echo off
   copy SetFile.bat + %1 $tmp$.bat > nul
   call $tmp$.bat
   del $tmp$.bat

%1 هو اسم ملف الإدخال الخاص بك وسيحتوي %FileContents% على محتويات ملف الإدخال بعد المكالمة.سيعمل هذا فقط على ملف سطر واحد (على سبيل المثال.ملف لا يحتوي على أحرف إرجاع).يمكنك إزالة/استبدال أحرف الإرجاع من الملف قبل استدعاء %tmp%.bat إذا لزم الأمر.

for /f "delims=" %%i in (count.txt) do set c=%%i
echo %c%
pause
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top