2009-05-01 12 views
2

Ich habe Probleme die Zeichenfolge nach dem bekommen versuchen: in den folgenden zwei Zeilen in zwei separate Variablen aus dem Boden einer Textdatei datei.txt zum BeispielBatch-Datei - in einer Variable

Number of files to delete: 27 Total 
Total size of files to delete: 1,427 KB 

genannt Ich will nur die 27 in einer Variablen und die 1427 in einer anderen. Diese werden zufällig aus einem Scan generiert und könnten mehr Ziffern enthalten.

Batch-Datei bitte, ich bin mit Fenster

Antwort

-1

Ich gehe davon aus Sie müssen dies in reiner bash zu tun.

#!/bin/bash 
S="$(<testfile.txt)" # load the data 

A="${S#*:}" # remove everything before the first : (including it) 
A="${A%%Total*}" # remove everything after the first "Total" (including it) 

B="${S##*:}" # remove everything before the last : (including it) 
B="${B% *}" # remove everything after the last space (including it) 

A="${A// }" # remove all spaces 
B="${B// }" 

echo "-$A-" # print results (showing that there are no spaces in it) 
echo "-$B-" 

ich Sie ermutigen Parameter Expansion Abschnitt man bash zu erkunden. Dort finden Sie zahlreiche nützliche Tricks.

+0

Ich habe einige Tests durchgeführt, dieses Skript (mit 'echo' entfernt) führt 3500times/s auf meiner Box, 22000 mal/s beim Laden der Datei ist nur einmal getan. Ich freue mich auf andere Lösungen mit Kopf, Schwanz, Schnitt und Katze;) –

+0

Das sieht aus wie eine ausgezeichnete Bash-Antwort, aber ich denke, er könnte auf Windows sein. Siehe Stapel- und cmd-Tags – Andy

4

So etwas sollte funktionieren:

@echo off 
setlocal enableextensions enabledelayedexpansion 

:: Get the number of lines in the file 
set LINES=0 
for /f "delims==" %%I in (file.txt) do (
    set /a LINES=LINES+1 
) 

:: Parse the last 2 lines and get the numbers into variable NUMS 
set /a LINES=LINES-2 
for /f "skip=%LINES% delims=" %%L in (file.txt) do (
    for /f "tokens=1-2* delims=:" %%A in ("%%L") do (
     for /f "tokens=1-2*" %%N in ("%%B") do set NUMS=!NUMS!%%N; 
    ) 

) 

:: Parse variable NUMS 
for /f "tokens=1-2* delims=;" %%A in ("%NUMS%") do (
    set NUM_FILES=%%A 
    set TOTAL_SIZE=%%B 
) 

@echo Number of files  = %NUM_FILES% 
@echo Total size of files = %TOTAL_SIZE% 
0

Dies ist meine volle Batch-Datei;

@echo on 
setlocal enableextensions enabledelayedexpansion 

:: Get the number of lines in the file 
set LINES=0 
for /f "delims==" %%I in (D:\clean.txt) do (
    set /a LINES=LINES+1 
    echo %LINES% 
) 

:: Parse the last 2 lines and get the numbers into variable NUMS 
set /a LINES=LINES-2 
echo %LINES% 
for /f "skip=%LINES% delims=" %%L in (D:\clean.txt) do (
    for /f "tokens=1-2* delims=:" %%A in ("%%L") do (
     for /f "tokens=1-2*" %%N in ("%%B") do set NUMS=!NUMS!%%N; 
    ) 

) 

:: Parse variable NUMS 
for /f "tokens=1-2* delims=;" %%A in ("%NUMS%") do (
    set NUM_FILES=%%A 
    set TOTAL_SIZE=%%B 
) 

@echo Number of files  = %NUM_FILES% 
@echo Total size of files = %TOTAL_SIZE% 

Sie können sehen, wo ich in die zusätzlichen Echos setzen auch den Wert der Variablen zu sehen und ich die vorherigen Screenshot erhalten. Warum funktioniert es für dich und nicht für mich? das ist nicht fair lol Ich habe Vista Home Basic SP1 32-bit

+0

Das 'echo% LINES%' innerhalb der 'for'-Schleife wird ausgewertet, bevor der 'for' -Befehl ausgeführt wird, so dass immer Null angezeigt wird. Um zu sehen, ob 'LINES' inkrementiert wird, verwenden Sie eine verzögerte Erweiterung; 'echo! LINES!'. Ansonsten funktioniert dein Skript für mich. Ich habe keinen Zugriff auf ein Vista-System, aber ich werde dies auf Windows 7 ausführen und sehen, was passiert. –

+0

Beide Scrips funktionieren für mich auf Windows 7. Siehe meine neueste Antwort für eine andere mögliche Lösung. –

0

Es sieht aus wie Sie ein Problem mit dem Lesen der ganzen Datei haben, um die Anzahl der Zeilen zu erhalten. Diese Lösung findet nur die Saiten Sie interessiert sind und die Werte erhalten:

@echo off 
setlocal enableextensions enabledelayedexpansion 

:: Get number of files to delete. 
for /f "usebackq tokens=1-7" %%A in (`findstr /b "Number of files to delete:" file.txt`) do (
    set NUM_FILES=%%F 
) 

:: Get total size of files. 
for /f "usebackq tokens=1-8" %%A in (`findstr /b "Total size of files to delete:" file.txt`) do (
    set TOTAL_SIZE=%%G 
) 

@echo Number of files  = %NUM_FILES% 
@echo Total size of files = %TOTAL_SIZE% 

Wenn die Saiten mit der Anzahl der Dateien und die Gesamtgröße je ändern, werden Sie das Skript entsprechend ändern.

1

jimbob, hier ist das, was ich kam mit:

delfiles.cmd

@echo off 
set file=clean.txt 
call :grep "Number of files to delete:" 
set files=%grep% 
call :grep "Total size of files to delete:" 
set size=%grep% 

echo %Files% files of a total size of %size% are to be deleted. 
exit /b 0 

:grep 
    setlocal 
    for /F "tokens=2 delims=:" %%i in ('findstr /i /c:"%~1" "%file%"') do (
     for /F "tokens=1 delims= " %%j in ("%%i") do set _find=%%j 
    ) 
    endlocal& set grep=%_find% 
    exit /b 0 

Dies ist kann eine wiederverwendbare Skript, wie die Datei und Strings mit den gleichen Ergebnissen geändert werden . Ich habe dein Beispiel kopiert/eingefügt und es hat gut funktioniert.

@Patrick Cuff: Sie Probleme könnten eine ganze Reihe ohne /c zu finden: ".." Teil. Könnte ein Teil des Problems gewesen sein, aber dann wird mein Skript vielleicht die gleichen Ergebnisse/Probleme geben ... Lebe und lerne, denke ich.

______Notes__________
set file =: diese in die Datei ein (und den Pfad, falls erforderlich) der Datei gescannt werden.
Aufruf: grep "Zeichenfolge": Rufen Sie die: Grep-Funktion mit der Zeichenfolge zu finden.
set var =% grep%: Setzen Sie eine Variable (hier Dateien und Größe) auf die Antwort von: grep.

: grep Funktion: Es sieht zuerst in der% Datei% für die "% string%", dann parse es auf das Zeichen ":", behält den rechten Teil. Dann parsen Sie es erneut mit "Leerzeichen" und behalten das erste Wort. Die Funktion gibt die Variable% grep% zurück, die die gefundene Zeichenfolge enthält.

Wie bei meinen üblichen Antworten hoffe ich, dass dies hilft.

Verwandte Themen