Jak przeglądać pliki nazwane w pliku tekstowym? Windows Server 2012

0
  • Windows cm 2012.exe pole
  • Muszę utworzyć plik wsadowy, nazwać go get.bat, aby przetworzyć wszystkie wymienione katalogi, w dlist.txtktórych znajduje się ten sam katalog jak get.bat. Nazwy katalogów są po jednym w wierszu w pliku dlist.txt. dlist.txt został utworzony za pomocą dir /b DIV_* > dlist.txt. Te pliki DIV_ są w rzeczywistości podkatalogami katalogu, w którym jest uruchamiany mój plik wsadowy.
  • Nie mogę użyć specyfikacji plików w poleceniu FOR, ponieważ dlist.txtpo utworzeniu muszę edytować ręcznie. Nie chcę przetwarzać wszystkich katalogów DIV_*, tylko niektóre z nich.
  • Tworzenie dlist.txtza dir /w DIV_* > dlist.txtpomocą oznacza, że ​​wszystkie nazwy katalogów mają [] wokół nich i nie mogę tego używać.
  • Jest jeden parametr, dla get.batktórego jest podstawową nazwą pliku, która zawiera wszystkie wyniki z fromxsfpolecenia. Rozszerzenie .txt zostanie dodane przez plik wsadowy.
  • Muszę wykonać wiele poleceń dla każdego dlist.txtkatalogu, z których niektóre ustawiają tymczasową nazwę pliku o nazwie% tempoutfile%, a następnie używaną w fromxsf.
  • Przeczytałem kilka stron, które znalazłem w Google, w tym niektóre z Superuser, ale przykłady, które mogą działać dla cmd.exe, nie działały dla mnie. Może Windows 2012 Server jest za stary? Nie mogę tego zmienić, muszę pracować z tym, co mam.
  • fromxsfprzetwarzający każdy katalog dlist.txtwymaga katalogu jako jednego parametru po -cdtymczasowym pliku wyjściowym jako innego parametru, którym jest% tempoutfile%.
  • Wygląda na to, że nie mamy PowerShell lub przynajmniej nie ma ustalonej ścieżki.

Oto, co próbowałem za pomocą pętli FOR:

set destdir=c:\tempdir
set outfile=%destdir%\%1.txt
FOR /F %%f in ('type dlist.txt') DO (
    echo "--------------------"

    echo Basedir=%%f should be directory
    set tempoutfile=../%%f.txt
    echo outfile=%destdir%\%outfile%
    echo tempoutfile=%tempoutfile%
    echo Processing dir %%f, to tempfile %tempfile%
    pause
    rem Below is the command to process the dir name in %%f to make a temp file in %tempoutfile%
    fromxsf %tempoutfile% -cd %%f +m -nbs -Rep -nofrills

    if exist "%destdir%" (
        echo " " >> %outfile%
        echo "{DIVNAME=%i}" >> %outfile%
        rem Append %tempoutfile% to %outfile%.
        type %tempoutfile% >> %outfile%
        del %tempoutfile%
    )
)

Dla powyższego wartość %% f jest zawsze pierwszą linią pliku dlist.txt. Nie tego chcę.

W pętli wypisuję przetworzoną zawartość katalogu do pliku tymczasowego w% tempfile%, a następnie konkatenuję zawartość% tempfile% do% destdir% \% outfile%. mycommandwymaga katalogu wejściowego %% f jako arg wiersza poleceń. Po prostu nie mogę przekierować STDOUT i dołączyć wyniku do% destdir% \% outfile%.

Próbowałem kilka alternatywnych pętli FOR:

  • FOR %%f in (dlist.txt) DO (. W tym przypadku %%fjest to zawsze druga nazwa katalogu dlist.txti nigdy się nie zmienia.

Czy ktoś wie jak to zrobić?

Dziękuję Ci!


EDYCJA: Dzięki. Zrozumiałem to za pomocą opóźnionego rozwoju i innego wpisu znalezionego za pomocą Google. Rdzeń pętli jest taki, z nazwami plików zawartymi w pliku tekstowym po dlist.txtjednej nazwie pliku w wierszu. Moim problemem była brakująca "tokens=*"opcja. Również zmienna! notacja musi być używana KAŻDY raz w pętli. Poniższa pętla zawiera również instrukcje echa pokazujące wartości zmiennych.

setlocal EnableDelayedExpansion
set outfile=c:\temp\tempout.txt
del %outfile%
FOR /f "tokens=*" %%f in (dlist.txt) DO (
    echo.
    echo --------------------
    set indir=%%f
    echo Basediv indir=!indir!
    echo Processing division !indir!

    echo. >> %outfile%
    echo {DIVNAME=!indir!} >> %outfile%
    pause
    fromxsf %outfile% -cd !indir! +m -nbs -Rep -nofrills -a
)

Kluczowe problemy w mojej pętli

  1. Użyj %%fzmiennej tylko raz na pętlę i przypisz ją do indir. Następnie użyj !indir!zmiennej.
  2. Usunąłem użycie, %tempoutfile%ponieważ fromxsfpolecenie pozwala mi dołączyć dane wyjściowe z siebie (używając -a) JEŻELI plik istnieje, co robi w tym przypadku.
Sitowie
źródło
1
1. Gdzie% tempoutfile% otrzymuje wartość? 2. Jeśli chodzi o ustawienie / rozwinięcie zmiennych w bloku wielowierszowym FOR lub IF, musisz przestudiować „opóźnione rozwinięcie” i !variable!notację z wykrzyknikiem .
Michael Harvey
@MichaelHarvey: była literówka. % tempoutfile% jest przypisany w górnej części pętli FOR.
Sitowie
Napraw opóźnioną ekspansję.
Michael Harvey,