Frage

Ich habe seit 20 Jahren in Dutzenden von Sprachen wurde die Programmierung, aber ich konnte nie verstehen, wie „FOR“ Arbeit in Windows cmd Batch-Datei-Shell, egal wie hart ich versuchte. Ich lese

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

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

und einige andere Artikel im Internet, aber verwirren noch und kann nichts erreichen.

Kann mir jemand eine kurze explaination geben wie „FOR“ Arbeiten im Allgemeinen?

Für eine wenig mehr spezifische Frage, wie kann ich durch jeden Pfad in% PATH% Variable iterieren? Ich habe versucht mit

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

Das würde zeigen nur den ersten Weg, nicht alle von ihnen. Warum ? Was ich falsch gemacht?

War es hilfreich?

Lösung

Keine der Antworten tatsächlich funktionieren. Ich habe es geschafft, die Lösung selbst zu finden. Das ist ein bisschen hackish, aber es löst das Problem für mich:

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
  )
)

Oh! Ich hasse Batch-Datei Programmierung !!

Aktualisiert

Mark-Lösung ist einfacher, aber es wird mit Pfad enthält Leerzeichen nicht. Dies ist ein wenig modifizierte Version von Mark-Lösung

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

Andere Tipps

Mark Idee war gut, aber vielleicht vergessen haben, einige Weg in ihnen Räume. Ersetzen ‚;‘ mit ‚“,‘stattdessen würden alle Pfade in Anführungszeichen schneiden.

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

So, hier haben Sie die Pfade angezeigt.

FOR-Befehl in cmd hat eine langwierige Einarbeitungszeit, vor allem, weil, wie Variablen reagieren innerhalb von () 's Aussagen ... Sie alle Variablen zuweisen können, aber man kann dann nicht wieder in den () lesen ist, es sei denn, Sie verwenden Sie die "setlocal ENABLEDELAYEDEXPANSION" Anweisung, und deshalb verwenden auch die Variablen mit !! 's statt %%' s (! _var!)

ich zur Zeit ausschließlich Skript mit cmd ein, für die Arbeit, hatte das alles zu lernen:)

Sie haben die richtige Idee, aber for /f ist so konzipiert, auf mehreren Leitungen Dateien oder Befehle zu arbeiten, nicht einzelne Strings.

In seiner einfachsten Form ist for wie Perl for oder jeder foreach der anderen Sprache. Sie geben es eine Liste von Token, und es iteriert sie jedes Mal den gleichen Befehl aufrufen.

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

Die Erweiterungen bieten lediglich automatische Möglichkeiten, die Liste von Token zu bauen. Der Grund Ihr aktueller Code ist mit nichts kommt, ist, dass ‚;‘ ist der Standardzeilenende (Kommentar) Symbol. Aber auch wenn Sie das ändern, würden Sie %%g, %%h, %%i, ... verwenden müssen die einzelnen Token zuzugreifen, die stark Ihre Batch-Datei begrenzen.

Die nächstgelegene Sie bekommen, was Sie fragen:

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

Aber das wird für zitiert Pfade fehlschlagen, die Semikolons enthalten.

Nach meiner Erfahrung for /l und for /r sind gut für die bestehenden Befehle erstrecken, aber ansonsten for ist äußerst begrenzt. Sie können es stärker leicht machen (und verwirrend) mit verzögerter variable Expansion (cmd /v:on), aber es ist wirklich nur gut für Listen von Dateinamen.

Ich würde vorschlagen, WSH oder Powershell verwenden, wenn Sie String-Manipulation durchführen müssen. Wenn Sie versuchen, whereis für Windows zu schreiben, versuchen where /?.

konnte nicht widerstehen diese dort werfen, alt wie dieser Thread ... Normalerweise, wenn die Notwendigkeit, durch jede der Dateien in PFAD iterieren entsteht, alles, was Sie wirklich tun möchten, ist eine bestimmte Datei finden ... Wenn das der Fall ist, diese Einzeiler das erste Verzeichnis ausspucken es findet Dateien in:

(ex: Suche nach java.exe)

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

Ich weiß, das SUPER alt ist ... aber nur zum Spaß habe ich beschlossen, diesen einen Versuch zu geben:

@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

Dies ist nicht eine Zählung erfordern und geht bis es fertig ist. Ich hatte das gleiche Problem mit Leerzeichen aber es macht es durch die gesamte Variable. Der Schlüssel dazu ist die Schleife Etikett und die SHIFT Funktion.

for /f Iterierten pro Zeile eingegeben wird, so in Ihrem Programm wird nur dann ausgegeben erster Weg.

Ihr Programm behandelt% PATH% als einzeilige Eingabe und deliminate von ;, legt erstes Ergebnis g %%, dann Ausgabe %% g (ersten deliminated Pfad).

FOR iteriert im Wesentlichen über die „Linien“ im Datensatz. In diesem Fall gibt es eine Zeile, die den Pfad enthält. Die "delims=;" sagt nur auf Semikolons zu trennen. Wenn Sie den Körper echo %%g,%%h,%%i,%%j,%%k ändern werden Sie sehen, dass es die Eingabe als eine einzige Leitung behandelt und in mehrere Token zu brechen.

Dies funktioniert für mich:

@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

Sie haben zusätzlich den tokens=1,2,... Teil der Optionen, die die for Schleife ermöglicht. Das hier wird tun, was man sich nur wünschen:

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")

In diesem Beispiel verarbeitet die ersten 12-Token (= Verzeichnisse% path%) nur. Es verwendet explizite Aufzählung von jedem der verwendeten Token. Beachten Sie, dass die Token Namen sind Groß- und Kleinschreibung.% Eines von% A unterscheidet

sein, um für Pfade mit Leerzeichen zu speichern, Surround alle % x mit Zitaten wie dieses "% i". Ich habe es nicht hier tun, wo ich nur die Token Echo.

Sie können auch tun s.th. wie folgt aus:

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 )

Dieses überspringt Token 2,4,6 und verwendet eine kleine Abkürzung ( „7-26“), um den Rest von ihnen zu nennen. Beachten Sie, wie% c,% b,% a in umgekehrter Reihenfolge diese Zeit verarbeitet werden, und wie sie jetzt ‚bedeuten‘ verschiedene Token, im Vergleich zu dem ersten Beispiel.

So dies sicherlich nicht die kurze Erklärung ist, dass Sie gefragt. Aber vielleicht die Beispiele helfen jetzt ein wenig besser zu klären ...

Hier ist eine gute Anleitung:

FOR / F - Wiederholungs Befehl:. Gegen eine Reihe von Dateien

FOR / F - Wiederholungs Befehl:. Gegen die Ergebnisse eines anderen Befehls

FOR - Befehl Loop: alle Optionen Dateien, Verzeichnisse, Liste

[Die ganze Führung (Windows XP-Befehle):

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

Edit:. Es tut uns Leid, nicht sehen, dass der Link bereits im OP war, wie es mir als ein Teil des Amazonas-Link erschien

Es funktioniert für mich, versuchen Sie es.

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

Es funktioniert für mich, versuchen Sie es.

für / f "tokens = * delims ="; % G in ( 'echo% PATH%') tun echo% g%

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top