2017-07-19 10 views
1

私の質問は、バッチを使用してテキストファイルから特定の番号を取得したいことに由来します。ここで私はあなたがそれを一括でnet accountsコマンドのちょうど標準出力で見ることができるようにバッチのファイルから特定の文字を取得していますか?

 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. 

を読みしようとしているテキストファイルです。私がやろうとしているのは、コンピュータのパスワードポリシーを保護するだけでなく、元に戻す場合にバックアップを取ることです。私はそれを確保するためのスクリプトがありますが、元に戻すことは難しい部分です。これは私が作成したバックアップからのものです。私はこのファイルから古い最小パスワード年齢、最大パスワード年齢、および最小パスワード長を取得しようとしています。彼らは現在0,40、および7です。

私はバッチプログラミングに新しいですので、どんな助けにも感謝します。おかげで再び

答えて

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 

あなたの状況に合わせてsourcedirの設定を変更する必要があります。

私のテストにあなたのデータが入っているq45181780.txtという名前のファイルを使用しました。

クリアを使用する変数(念のため、彼らはalreadt割り当てられた値を持っている)

:にtokenising、ファイルの各行を読み、%%aに最初のトークンを割り当て、%%b 2番目。 %%aが有効な文字列と一致する場合は、set /aを使用して変数を設定します(これらのデータ項目は数値なので)。

レポート。

@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 

実際のネットは、出力ファイルをアカウントの名前にaccountinfo.txt変更することを忘れないでください:

+0

ありがとうございます。私はそれらの変数を 'net'で使ってみましたが、うまくいきません。私は 'net accounts/minpwlen:%minpasslen%'を試しましたが、うまくいかないようです。 「コマンドは正常に完了しました」と表示されますが、何も変わりません。これ以上の助けをいただければ幸いです。 – MathMXC

+0

バッチファイルは、最初に 'setlocal'コマンドを含むのが普通です。このコマンドは、バッチによって変更され、最終的にバッチが終了したときに元の環境を変更せずに元に戻すローカル環境を設定します。これは、他のバッチによってどの変数が設定されているかを心配することなく、環境がきれいに保たれるように、このように行われます。 – Magoo

+0

*この特定の* cmdインスタンスの環境内の値を意図的に*変更したい場合は、 'setlocal'コマンドを削除するか(この' cmd 'でバッチによって行われた* 'goto:eof'に到達したかどうかを終了する直前に' endlocal&set needth =%needthis%&set needthat =%needthat% '(すべてが同じ物理行になければなりません)または「exit/b」と入力します。これは、行全体が解決されて実行されるような解析トリックを使用します。ローカル環境を終了し、その時の現在の値に変数を設定する – Magoo

1

は、ここで(言語固有)は、私はそれを行うだろうかです。


ます。また、あまりにもテキストファイルに出力することなく値を読み取ることができる必要があります:

@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

私は、なぜテキストから変数名を取得していないと思ったコンポの第二バッチに触発さ:

> 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 

サンプル出力:

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

これはPowerShellの正規表現で各行を解析することで実現できます。

$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 
関連する問題