سؤال

لقد تم برمجة في عشرات اللغات لمدة 20 عاما ولكن أنا لا يمكن أبدا أن نفهم كيف "من أجل" العمل في ويندوز cmd shell ملف دفعي مهما حاولت.قرأت

http://www.amazon.com/Windows-Administration-Command-Line-Vista/dp/0470046163/ref=sr_1_1?ie=UTF8&s=books&qid=1241362727&sr=8-1

http://www.ss64.com/nt/for.html

والعديد من المواد الأخرى على شبكة الإنترنت ولكن لا يزال الخلط و لا يمكن إنجاز أي شيء.

أي شخص يمكن أن تعطيني موجز كسبلايناتيون على كيفية "ل" يعمل بشكل عام ؟

قليلا أكثر تحديدا السؤال كيف يمكنني تكرار خلال كل مسار في مسار ٪ ٪ متغير ؟ لقد حاولت مع

rem showpathenv.bat
for /f "delims=;" %%g in ("%PATH%") do echo %%g

سوف تظهر فقط في أول الطريق ، ليس كل منهم.لماذا ؟ ما أقوم به خطأ ؟

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

المحلول

أي من الإجابات في الواقع العمل.لقد تمكنت من العثور على الحل بنفسي.هذا هو قليلا hackish ، لكنه حل المشكلة بالنسبة لي:

echo off
setlocal enableextensions
setlocal enabledelayedexpansion
set MAX_TRIES=100
set P=%PATH%
for /L %%a in (1, 1, %MAX_TRIES%) do (
  for /F "delims=;" %%g in ("!P!") do (
    echo %%g
    set P=!P:%%g;=!
    if "!P!" == "%%g" goto :eof
  )
)

أوه !أنا أكره ملف دفعي البرمجة !!

تحديث

مارك الحل هو أبسط لكنها لن تعمل مع مسار تحتوي بيضاء.هذا هو نسخة معدلة من مارك الحل

echo off
setlocal enabledelayedexpansion
set NonBlankPath=%PATH: =#%
set TabbedPath=%NonBlankPath:;= %
for %%g in (%TabbedPath%) do (
  set GG=%%g
  echo !GG:#= !
)

نصائح أخرى

وفكرة مارك كانت جيدة، ولكن ربما نسيت بعض الطريق يكون المساحات فيها. استبدال '؛' مع "" "بدلا من شأنه قطع جميع الطرق إلى سلاسل نقلت.

set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo %%~p

وحتى هنا، لديك المسارات الخاصة بك عرضها.

FOR الأوامر في كمد لديه منحنى التعلم مملة، لا سيما بسبب كيف تتفاعل المتغيرات خلال () الصورة البيانات ... يمكنك تعيين أية متغيرات، ولكن لا يمكنك قراءة ثم العودة ضمن () الصورة، إلا إذا استخدام "ENABLEDELAYEDEXPANSION setlocal" بيان، وبالتالي أيضا استخدام المتغيرات مع !! الصورة بدلا من ٪٪ الصورة (! _var!)

وأنا حصرا حاليا النصي مع كمد، للعمل، وكان لتعلم كل هذا:)

وكنت قد حصلت على فكرة الحق، ولكن تم تصميم for /f للعمل على ملفات متعدد الخطوط أو أوامر، لا سلاسل الفردية.

في أبسط أشكالها، for مثل for بيرل، أو foreach كل لغة الآخر. يمكنك تمرير ذلك قائمة من الرموز، وبالتكرار عليها، واصفا الأمر نفسه في كل مرة.

for %a in (hello world) do @echo %a

وملحقات مجرد توفير سبل التلقائي من بناء قائمة من الرموز. السبب التعليمات البرمجية الحالية هو الخروج مع أي شيء هو أن "; 'هو نهاية الافتراضي رمز خط (تعليق). ولكن حتى لو قمت بتغيير ذلك، كنت قد لاستخدام %%g, %%h, %%i, ... للوصول إلى الرموز الفردية، والتي سوف تحد بشدة من الملف الدفعي.

والأقرب يمكنك الحصول على ما تسأل عنه هو:

set TabbedPath=%PATH:;= %
for %%g in (%TabbedPath%) do echo %%g

ولكن هذا ستفشل لمسارات نقلت التي تحتوي منقوطة.

في تجربتي، for /l وfor /r جيدة لتوسيع أوامر القائمة، ولكن على خلاف for غير محدودة للغاية. يمكنك ان تجعل قليلا أكثر قوة (ومربكة) مع التوسع متغير تأخر (cmd /v:on)، لكنها في الحقيقة جيدة فقط لقوائم أسماء

وأنا أقترح باستخدام WSH أو بوويرشيل إذا كنت تحتاج إلى تنفيذ سلسلة التلاعب. إذا كنت تحاول إرسال whereis ويندوز، في محاولة where /?.

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

و(مثلا: تبحث عن JAVA.EXE)

for %%x in (java.exe) do echo %%~dp$PATH:x

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

@Echo OFF
setlocal
set testpath=%path: =#%
FOR /F "tokens=* delims=;" %%P in ("%testpath%") do call :loop %%P
:loop
if '%1'=='' goto endloop
set testpath=%1
set testpath=%testpath:#= %
echo %testpath%
SHIFT
goto :loop
:endloop
pause
endlocal
exit

وهذا لا يحتاج إلى العد، وسوف تذهب حتى ينتهي. كان لي نفس المشكلة مع المساحات ولكنها جعلت من خلال المتغير بأكمله. المفتاح لهذا هو التسميات حلقة وظيفة SHIFT.

وبالتكرار for /f في خط المدخلات، وذلك في برنامجك لن يؤدي إلا الطريق الأول إخراج.

والبرنامج يعامل٪ PATH٪ كمساهمة من سطر واحد، وdeliminate التي كتبها ;، ووضع النتيجة الأولى إلى ٪٪ ز، ثم ٪٪ الناتج ز (مسار أولا deliminated).

وFOR وبالتكرار أساسا على "الخطوط" في مجموعة البيانات. في هذه الحالة، هناك خط واحد يحتوي على المسار. و"delims=;" هو مجرد قول ذلك للفصل في منقوطة. إذا قمت بتغيير الجسم لecho %%g,%%h,%%i,%%j,%%k سترى أنها معالجة المدخلات كخط واحد وكسرها إلى الرموز متعددة.

وهذا يعمل بالنسبة لي:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
@REM insure path is terminated with a ;
set tpath=%path%;
echo.
:again
@REM This FOR statement grabs the first element in the path
FOR /F "delims=;" %%I IN ("%TPATH%") DO (
  echo    %%I 
  @REM remove the current element of the path
  set TPATH=!TPATH:%%I;=!
)
@REM loop back if there is more to do. 
IF DEFINED TPATH GOTO :again

ENDLOCAL

عليك بالإضافة إلى ذلك استخدام tokens=1,2,... جزء من الخيارات التي for حلقة يسمح.هنا سوف تفعل ما تريد:

for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12 delims=;" %a in ("%PATH%") ^
do ( ^
     echo. %b ^
   & echo. %a ^
   & echo. %c ^
   & echo. %d ^
   & echo. %e ^
   & echo. %f ^
   & echo. %g ^
   & echo. %h ^
   & echo. %i ^
   & echo. %j ^
   & echo. %k ^
   & echo. ^
   & echo.   ...and now for some more... ^
   & echo. ^
   & echo. %a ^| %b ___ %c ... %d ^
   & dir "%e" ^
   & cd "%f" ^
   & dir /tw "%g" ^
   & echo. "%h  %i  %j  %k" ^
   & cacls "%f")

هذا المثال عمليات أول 12 الرموز (=الدلائل من مسار٪٪) فقط.ويستخدم بالنص الصريح من كل من يستخدم الرموز.لاحظ أن رمز الأسماء حساسة لحالة الأحرف:%مجموعة مختلفة من %ألف

أن يكون حفظ المسارات مع مساحات تحيط كل %س مع اقتباسات مثل هذا "%أنا".أنا لم أفعل ذلك هنا حيث أنا فقط مرددا الرموز.

يمكنك أيضا القيام s.ال.مثل هذا:

for /f "tokens=1,3,5,7-26* delims=;" %a in ("%PATH%") ^
do ( ^
     echo. %c ^
   & echo. %b ^
   & echo. %a ^
   & echo. %d ^
   & echo. %e ^
   & echo. %f ^
   & echo. %g ^
   & echo. %h ^
   & echo. %i ^
   & echo. %j ^
   & echo. %k )

هذا واحد يتخطى الرموز 2,4,6 ويستخدم المختصر ("7-26") إلى اسم من تبقى منهم.لاحظ كيف %c %ب ، ٪ يتم معالجتها في ترتيب عكسي هذه المرة ، وكيف أنها الآن 'يعني' مختلفة الرموز ، مقارنة مع المثال الأول.

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

هنا هو دليل جيد:

ل /F - حلقة الأمر:ضد مجموعة من الملفات.

ل /F - حلقة الأمر:ضد نتائج آخر الأمر.

عن حلقة الأمر:جميع الخيارات الملفات, دليل, القائمة.

[كل دليل (Windows XP الأوامر):

http://www.ss64.com/nt/index.html

تحرير: آسف لم أرى هذا الرابط بالفعل في العملية ، كما ظهر لي كجزء من رابط الأمازون.

وكان يعمل بالنسبة لي، انها محاولة.

for /f "delims=;" %g in ('echo %PATH%') do echo %g%

وكان يعمل بالنسبة لي، انها محاولة.

ولF / "الرموز = * = delims." ٪ غرام في ( 'صدى٪ PATH٪') القيام صدى٪ ز٪

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