2017-07-19 8 views
1

Also meine Frage kommt aus dem Wunsch, bestimmte Zahlen aus einer Textdatei mit Batch zu bekommen. Hier ist die Textdatei IBestimmte Zeichen aus einer Datei im Stapel abrufen?

 Force user logoff how long after time expires?:  Never 
     Minimum password age (days):       0 
     Maximum password age (days):       40 
     Minimum password length:        7 
     Length of password history maintained:    None 
     Lockout threshold:         Never 
     Lockout duration (minutes):       30 
     Lockout observation window (minutes):     30 
     Computer role:          WORKSTATION 
     The command completed successfully. 

zu lesen versuchen Wie Sie sehen können es nur die Standardausgabe des net accounts Befehls im Batch ist. Was ich versuche zu tun, ist eine Computer-Passwort-Politik zu sichern, aber auch eine Sicherung zu machen, wenn sie es rückgängig machen wollen. Ich habe das Skript, um es zu sichern, aber das Rückgängigmachen ist der schwierige Teil. Dieser Ausgang stammt aus dem Backup, das ich erstellt habe. Ich versuche, das alte Mindestalter für das Kennwort, das maximale Kennwortalter und die Mindestlänge für das Kennwort aus dieser Datei zu ermitteln. Sie sind derzeit 0, 40 und 7.

Ich bin relativ neu zu Batch-Programmierung, so dass jede Hilfe geschätzt werden würde. Danke wieder

Antwort

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q45181780.txt" 
FOR %%a IN (minpassage maxpaxxage minpasslen) DO SET "%%a=" 
FOR /f "usebackqtokens=1*delims=:" %%a IN ("%filename1%") DO (
IF "%%a"=="Minimum password age (days)" SET /a minpassage=%%b 
IF "%%a"=="Maximum password age (days)" SET /a maxpassage=%%b 
IF "%%a"=="Minimum password length" SET /a minpasslen=%%b 
) 
ECHO Min pass age=%minpassage% 
ECHO Max pass age=%maxpassage% 
ECHO Min pass len=%minpasslen% 

:: adding in the "net account" command 
:: Note that this command is merely ECHOed for testing. 
:: If all seems in order, remove the "ECHO " from the following command 

ECHO net accounts /minpwlen:%minpasslen% 

GOTO :EOF 

Sie müssten die Einstellung von sourcedir an Ihre Umstände anpassen.

Ich habe eine Datei namens q45181780.txt verwendet, die Ihre Daten für meine Tests enthält.

Löschen der Variablen verwendet werden (nur für den Fall haben sie alreadt einen zugewiesenen Wert bekam)

Lesen Sie jede Zeile der Datei, tokenising auf : und weisen das erste Token zu %%a, um die zweite %%b. Wenn %%a mit der signifikanten Zeichenfolge übereinstimmt, verwenden Sie set /a, um die Variable festzulegen (da diese Datenelemente numerisch sind)

Bericht.

+0

Vielen Dank für Ihre Antwort. Ich habe versucht, diese Variablen in einem "Netz" zu verwenden, aber es scheint nicht zu funktionieren. Ich habe versucht, net accounts/minpwlen:% minpasslen%, aber es scheint nicht zu funktionieren. Es sagt "Befehl erfolgreich abgeschlossen", aber nichts ändert sich. Jede weitere Hilfe wäre willkommen. – MathMXC

+0

Es ist üblich, dass Batch-Dateien zu Beginn einen 'setlocal'-Befehl enthalten. Dieser Befehl legt eine lokale Umgebung fest, die dann vom Stapel geändert und schließlich zurückgesetzt wird, wenn der Stapel beendet wird, wodurch die ursprüngliche Umgebung unverändert wiederhergestellt wird. Dies geschieht auf diese Weise, damit die Umgebung sauber bleibt, ohne sich Gedanken darüber machen zu müssen, welche Variablen von anderen Chargen eingerichtet wurden. – Magoo

+0

Wenn Sie * absichtlich * die Werte in der Umgebung für * diese bestimmte * cmd-Instanz ändern wollen, dann entfernen Sie entweder den 'setlocal'-Befehl (der bewirkt, dass * jede * Änderung vom Batch in diesem 'cmd" bleibt ") 'instance) * oder * Führe einen Befehl' endlocal & set neethth =% brauchtdies% & set needthat =% needthat% '(alle müssen auf der gleichen physischen Zeile sein) vor dem Beenden aus, entweder durch Erreichen des Dateiendes' goto: eof' oder 'exit/b'. Dies verwendet einen Parsing-Trick, bei dem die gesamte Zeile aufgelöst und dann ausgeführt wird; Beenden Sie die lokale Umgebung und setzen Sie dann die Variablen auf ihre aktuellen Werte – Magoo

1

Hier ist, wie ich es tun würde, (sprachspezifisch):

@Echo Off 
For %%A In (min max len) Do Set "%%A=" 
For /F "Tokens=2 Delims=:" %%A In ('Find "imum"^<"accountinfo.txt"' 
) Do For %%B In (%%A) Do If Not Defined min (Set "min=%%B" 
) Else If Not Defined max (Set "max=%%B") Else Set "len=%%B" 
For %%A In (min max len) Do Set %%A 
Pause 

Bitte denken Sie daran accountinfo.txt auf den Namen Ihrer tatsächlichen Nettokonten Dateiausgabe zu ändern.


Sie sollten auch in der Lage sein, nur die Werte zu lesen, ohne zu in eine Textdatei ausgibt:

@Echo Off 
For %%A In (min max len) Do Set "%%A=" 
For /F "Tokens=2 Delims=:" %%A In ('Net Accounts^|Find "imum"' 
) Do For %%B In (%%A) Do If Not Defined min (Set "min=%%B" 
) Else If Not Defined max (Set "max=%%B") Else Set "len=%%B" 
For %%A In (min max len) Do Set %%A 
Pause 
1

Inspiriert von Compo des zweiten Partie dachte ich, warum nicht die Variablennamen aus dem Text erhalten:

> type PassMinMax.cmd 
@Echo off 
For /F "tokens=1,2delims=:" %%A in ('net accounts^|find "imum"' 
) Do For /f "tokens=1-3" %%C in ("%%A") Do @Set /A %%D_%%C_%%E=%%B 
Set Pass 

Beispielausgabe:

> PassMinMax.cmd 
password_Maximum_age=42 
password_Minimum_age=0 
password_Minimum_length=0 
1

Dies könnte erreicht werden, indem jede Zeile mit einem Regex in PowerShell analysiert wird.

$lines = Get-Content -Path ./parsepw.txt 

foreach ($line in $lines) { 
    if ($line -match '\s*Minimum password age \(days\):\s*([0-9]*)\w*') { $minpwage = [int]$Matches[1] } 
    elseif ($line -match '\s*Maximum password age \(days\):\s*([0-9]*)\w*') { $maxpwage = [int]$Matches[1] } 
    elseif ($line -match '\s*Minimum password length:\s*([0-9]*)\w*') { $minpwlen = [int]$Matches[1] } 
} 

$minpwage 
$maxpwage 
$minpwlen 
Verwandte Themen