2016-04-28 28 views
1

So mache ich eine Batch-Datei, um einige Backups von einigen alten Computern zu machen und habe es ziemlich schwer, die Dateitypen zu drucken, die ich versuche, auf die cmd-Eingabeaufforderung zu sichern, denn wenn ich dies ausführe, ändert sich der Text " * .png "in" myfile.png ". Es ist also wie ein Platzhalter funktionieren, obwohl ich gerade bin versucht zu drucken „* .png“Wie verarbeitet man eine Liste von durch Leerzeichen getrennten Dateitypmustern in einer Schleife?

Hier ist der Code, den ich habe:

echo off 
cls 
set "SelectedFileTypes=*.pdf *.docx *.tif *.txt *.png *.xcf *.jpeg *.raw *.jpg *.mp3 *.mp4 *.m4a *.wmv *.msdvd *.itdb" 
echo %SelectedFileTypes% 
echo/ 
for %%I in (%SelectedFileTypes%) do echo %%I 
pause 

Hier ist die Ausgabe Ich möchte:

*.pdf *.docx *.tif *.txt *.png *.xcf *.jpeg *.raw *.jpg *.mp3 *.mp4 *.m4a *.wmv *.msdvd *.itdb 

*.pdf 
*.docx 
*.tif 
*.txt 
*.png 
*.xcf 
*.jpeg 
*.raw 
*.jpg 
*.mp3 
*.mp4 
*.m4a 
*.wmv 
*.msdvd 
*.itdb 

Hier ist die Ausgabe ich die meiste Zeit bekommen, alles zu sein, die Dateien scheint, die im Verzeichnis entsprechen in ich bin.

*.pdf *.docx *.tif *.txt *.png *.xcf *.jpeg *.raw *.jpg *.mp3 *.mp4 *.m4a *.wmv *.msdvd *.itdb 

A+Study.pdf 
after.txt 
before.txt 
story of my life.txt 
TshirtIdea.txt 
bananaForScale.png 
windows_logo.png 
BadTree.xcf 
7ed48ccf-5746-4c86-b5c4-8c02ba0ccbf9.jpg 

Antwort

1

Die Ausgabe ist korrekt für Ihren Stapelcode als Befehl FOR ohne Option /F interpretiert die Liste der Dateinamenmuster wie Befehl DIR und gibt alle Dateinamen zurück, die mit einem der angegebenen Muster übereinstimmen.

Hier ist ein Beispiel, wie Sie die Liste der Dateinamenmuster in einer Schleife verarbeiten können, wie Sie es wünschen.

@echo off 
cls 
setlocal EnableDelayedExpansion 

rem Define the file type patterns in a single space separated list. 
set "SelectedFileTypes=*.pdf *.docx *.tif *.txt *.png *.xcf *.jpeg *.raw *.jpg *.mp3 *.mp4 *.m4a *.wmv *.msdvd *.itdb" 

rem Append a space at end if there is not already a space at end. 
if not "%SelectedFileTypes:~-1%" == " " set "SelectedFileTypes=%SelectedFileTypes% " 

rem This loop is executed until all file type patterns are processed 
rem determined by an empty string for the remaining file type patterns. 
rem The FOR command returns the first pattern of the space separated 
rem patterns and the string substitution removes this pattern and the 
rem following space from the list of file name patterns. 

:NextFileType 
if "%SelectedFileTypes%" == "" goto Finished 
for /F "tokens=1" %%# in ("%SelectedFileTypes%") do (
    set "FileType=%%#" 
    set "SelectedFileTypes=!SelectedFileTypes:%%# =!" 
) 

rem Do here whatever should be done with this file type pattern. 
echo File type is: %FileType% 
goto NextFileType 

:Finished 
echo Processed all file types. 
endlocal 
pause 

für die verwendeten Befehle verstehen und wie sie arbeiten, öffnen Sie eine Eingabeaufforderung, führen Sie dort die folgenden Befehle ein und vollständig alle Hilfeseiten für jeden Befehl angezeigt sehr sorgfältig lesen.

  • cls /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?

Für andere Lösungen zu suchen auf der Liste zurück durch eine Stack-Überlauf-Suche mit [batch-file] split string als Suchbegriffe ausgeführt wird.

1

Sie können eine Unterroutine mit call verwenden und den Wert SelectedFileTypes als Argumente übergeben. Zusammen mit shift, if und goto können Sie eine bedingte Schleife erstellen, die jedes einzelne Element von SelectedFileTypes zurück:

@echo off 
cls 
set "SelectedFileTypes=*.pdf *.docx *.tif *.txt *.png *.xcf *.jpeg *.raw *.jpg *.mp3 *.mp4 *.m4a *.wmv *.msdvd *.itdb" 
echo(%SelectedFileTypes% 
echo(
call :SUB %SelectedFileTypes% 
pause 
exit /B 

:SUB 
shift 
if "%~0"=="" goto :EOF 
echo(%~0 
goto :SUB 

Der große Vorteil dieses Ansatzes ist, dass Sie nicht das Parsen auf eigene Faust zu tun haben, aber lassen der Befehlsinterpreter tut es und unterstützt die Standardtrennzeichen SPACE, TAB, ,, ; und =.