- Windows cm 2012.exe pole
- Muszę utworzyć plik wsadowy, nazwać go
get.bat
, aby przetworzyć wszystkie wymienione katalogi, wdlist.txt
których znajduje się ten sam katalog jakget.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.txt
po utworzeniu muszę edytować ręcznie. Nie chcę przetwarzać wszystkich katalogówDIV_*
, tylko niektóre z nich. - Tworzenie
dlist.txt
zadir /w DIV_* > dlist.txt
pomocą oznacza, że wszystkie nazwy katalogów mają [] wokół nich i nie mogę tego używać. - Jest jeden parametr, dla
get.bat
którego jest podstawową nazwą pliku, która zawiera wszystkie wyniki zfromxsf
polecenia. Rozszerzenie .txt zostanie dodane przez plik wsadowy. - Muszę wykonać wiele poleceń dla każdego
dlist.txt
katalogu, z których niektóre ustawiają tymczasową nazwę pliku o nazwie% tempoutfile%, a następnie używaną wfromxsf
. - 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.
fromxsf
przetwarzający każdy katalogdlist.txt
wymaga katalogu jako jednego parametru po-cd
tymczasowym 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%. mycommand
wymaga 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%%f
jest to zawsze druga nazwa katalogudlist.txt
i 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.txt
jednej 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
- Użyj
%%f
zmiennej tylko raz na pętlę i przypisz ją doindir
. Następnie użyj!indir!
zmiennej. - Usunąłem użycie,
%tempoutfile%
ponieważfromxsf
polecenie pozwala mi dołączyć dane wyjściowe z siebie (używając -a) JEŻELI plik istnieje, co robi w tym przypadku.
źródło
!variable!
notację z wykrzyknikiem .