Syntax für den Erfolgscode des Befehls "Where"

0

Wie lautet die Syntax, um beim Ausführen des Befehls "Where" einen Erfolgscode zu erhalten? Ich brauche das, um eine Schleife zu beenden.

Und wie lautet die Syntax, um das Verzeichnis der gefundenen Datei abzurufen?

Dieser Befehl:

WHERE / r "C: \ Dir \ Dir2 FindMe.txt"

zeigt die Datei im Befehlsfenster korrekt an:

C: \ Dir1 \ Dir2 \ Dir3 \ FindMe.txt

Aber was mache ich jetzt? Bitte seien Sie nett, ich bin weniger als ein Anfänger.

BEARBEITEN: Meine Frage ist ähnlich wie https://stackoverflow.com/questions/7562506 , aber in meinem Fall befindet sich die gesuchte Datei nicht im direkten Pfad, sondern oben, oben und unten. Im angegebenen Beispiel könnte sich meine Datei ausgehend von demselben Verzeichnis in C: \ Temp \ Dir1 \ Dir2 \ Dir3 ** \ Dir14 \ Dir15 ** \ FindMe.txt befinden. Das heißt, ich muss zu Dir3 gehen, dort meine Datei mit dem WHERE-Befehl finden und meine Schleife stoppen.

EDIT 2: Ich habe alles ausgezogen, was ich konnte. Erstellen Sie irgendwo eine TXT-Datei "FindMe.txt", platzieren Sie diesen Code als .cmd und ziehen Sie dann eine andere TXT-Datei auf die .cmd-Datei. Mit etwas Glück sollte es mit dem Verzeichnis von FindMe.txt als Antwort aufhören. Was ich brauche, ist der Pseudocode:

@ECHO OFF

SET "cmdPath=%~dp0"
SET "cmdPath=%cmdPath:~0,-1%"  ::without back slash
SET "searchPath=%cmdPath%"     ::start search here

:loop
  IF EXIST "%searchPath%\FindMe.txt" (
    set "txtPath=%searchPath%
    ECHO txtPath%searchPath%\FindMe.txt
    GOTO :EOF
  )
  IF "%searchPath:~1%" == ":" (
    ECHO FindMe.txt not found.
    pause
    GOTO :EOF
  )
  echo searchPath=%searchPath%
rem run: WHERE /r "%searchPath%" /q FindMe.txt
rem if successful (found) (
rem run: WHERE /r "%searchPath%" FindMe.txt 
rem just keep the path and rename to txtPath
rem goto :eof
  CALL :getPath "%searchPath%"
  GOTO loop
:end

:getPath
SET "searchPath=%~dp1"
SET "searchPath=%searchPath:~0,-1%"
:end
:eof
JuergenL
quelle
1
Willkommen bei Super User. Ihre Frage ist zu vage. Was meinst du mit "Erfolgscode"? Es wäre hilfreich, wenn Sie uns mitteilen, was Sie tun möchten. Auch wenn Sie den Teil des Stapelcodes hinzufügen, der Probleme mit Ihrer Frage verursacht, können wir den gesamten Kontext anzeigen. Da ist ein bearbeiten Link unter der Frage.
CharlieRB
@CharlieRB siehe meine Bearbeitung
JuergenL

Antworten:

1

Um herauszufinden, ob der where-Befehl erfolgreich war, untersuchen Sie nach der Ausführung die% errorlevel%:

c:\tmp>where x
c:\tmp\x
c:\tmp>echo %errorlevel%
0
c:\tmp>where y
INFO: Could not find files for the given pattern(s).
c:\tmp>echo %errorlevel%
1

Und um die Ausgabe des Befehls find zu speichern, können Sie Folgendes verwenden (es gibt jedoch mehrere Möglichkeiten):

c:\tmp>for /f %i in ('where cmd.exe') do @set ans=%i

c:\tmp>echo %ans%
C:\Windows\System32\cmd.exe

(Sie können die Ausgabe auch in eine temporäre Datei umleiten und dann beispielsweise die temporäre Datei lesen.)

Beachten Sie, dass Sie, wenn Sie dies in eine Batchdatei einfügen, die% -Zeichen in der Zeile mit dem Befehl for verdoppeln müssen.

Beachten Sie auch, dass wenn Sie dies mehrmals tun würden, z. B. in einem Unterprogramm, das 'ans' nicht gesetzt wird, wenn keine Datei gefunden wurde (weil die for-Schleife keine Iterationen hatte - wenn dies für Sie keinen Sinn ergibt ignoriere es einfach), also musst du die Fehlerstufe überprüfen, bevor du die Ans verwendest.

Beachten Sie auch, dass das Überprüfen des Errorlevels nach der for-Schleife nichts über den where-Befehl selbst aussagt.

Fragen Sie nicht, warum Sie nicht einfach so etwas tun können path = `where x`; , weil ich es nicht weiß. Und Batch-Scripting bereitet mir immer Kopfschmerzen. Es gibt übrigens viel leistungsfähigere Skriptsprachen, wenn Sie in Sachen Skripterstellung weiterkommen möchten.

Hier ist ein Weg, der die Fehlerebene überhaupt nicht benutzt. Fügen Sie den folgenden Code in eine Batchdatei ein und ändern Sie den Befehl where in die gesuchte Datei. Lassen Sie den Teil "2 & gt; nul" jedoch intakt, oder es werden weiterhin Fehlermeldungen ausgegeben, dass die Datei erst gefunden wurde, nachdem sie gefunden wurde.

@echo off

REM set location to an empty string
set location=

REM set the command to run in a loop
set command="where testfile 2> nul"

REM simulating a while loop
:while1
REM running the command defined above and storing the result in the "location" variable.
REM Note: result will only be stored if a file was actually found. If not, the "set location" part is not executed.
for /f %%i in ('%command%') do @set location=%%i
if "%location%" == "" (
    REM location is STILL an empty string like we set in the beginning; no file found
    REM let's sleep for a second to not overload the system
    timeout /t 1 > nul
    REM ... and go back the :while tag
    goto :while1
)

REM If we got to this point, a file was found, because location wasn't an empty string any more.

echo location: %location%
SadBunny
quelle
Danke, aber das muss ich verdauen. Ich glaube, ich verstehe den Erfolgscode, habe ihn aber noch nicht ausprobiert. Ich war bereit, WHERE zweimal auszuführen, einmal, um die Schleife anzuhalten und einmal, um das Verzeichnis abzurufen. Vielleicht kann ich etwas Ähnliches wie den Erfolgscode verwenden?
JuergenL
Wie wäre es mit so etwas? Ich habe einen Weg gefunden, den where-Befehl zweimal auszuführen, nachdem die Datei gefunden wurde. Testen Sie nur nicht die Fehlerstufe, sondern den zugewiesenen Wert. Ich weiß nicht, warum ich vorher nicht daran gedacht habe. Siehe meine aktualisierte Antwort.
SadBunny
Ich habe Ihren (ersten) Vorschlag ausprobiert, konnte ihn aber nicht zum Laufen bringen. Schauen Sie sich meine letzte Bearbeitung an, vielleicht erklärt das mein Problem besser. - Danke, dass du bei mir bist. Ich habe über Tage unzählige Stunden damit verbracht, bin aber nicht weitergekommen.
JuergenL
Dauerte länger als erwartet, siehe aktualisierte Antwort jetzt.
SadBunny