2012-01-15 1 views
2

ここでは他にもいくつかの質問を確認しましたが、必要なものを見つけることができませんでした。現在、どのHyper-VサーバーにどのようなVMが含まれているかを調べるプロセスを自動化しようとしています。ここに私の現在のスクリプトがあります。cmdまたはpowershellを使用してテキストを解析および削除する

@echo off 
set /P dc= "Which DC do you want? " 
dsquery computer -name %DC%VUT* > dsquery.txt 
type dsquery.txt | findstr /v IMAGINGOU | findstr /v OTHEROU > dsquery2.txt 
powershell -command Get-Content dsquery2.txt | ForEach-Object { $_ -replace '"CN=', "" } | Set-Content dsquery3.txt 
powershell -command Get-Content dsquery3.txt | ForEach-Object { $_ -replace ',OU=CAM,OU=Exchange,OU=Server,DC=RED001,DC=local"', "" } | Set-Content serverlist.txt 
powershell -command .\Get-HyperVMod.ps1 -file output.csv 

私がヒットしている問題は、彼らがForEach-を行うことができますPowerShellとWin2k8サーバの古いバージョンを持っているので、私は(WIN2K3)からDSQUERYを行うことができますサーバーは、のForEach-Objectにはできないですオブジェクトはdsqueryを実行できません。

ここでは、サーバー名以外のすべてを解析して削除しようとしているdsquery出力のサンプルを示します。

"CN=SERVER001,OU=VUT,OU=Infastructure,OU=Server,DC=dcname,DC=local" 
"CN=SERVER008,OU=ImagingWDS,DC=red002,DC=local" 

出力は、別の方法またはファイルから余分なテキストを除去するだけで私の小さな問題でこれをやってどちらかに

SERVER001 
SERVER008 

任意の提案をする必要があります。

答えて

0

ForEach-ObjectコマンドレットはPowerShell V1で導入されました。

Jon's regex hereは、LDAP文字列から共通名を引き出す方法を示しています。

これは、テキストファイルの各行に正規表現を適用し、結果を返します。

Get-Content file.txt | % { $_ -replace '(CN=)(.*?),.*', '$2' } 

更新 ここでは、あなたのバッチスクリプトは、PowerShellのに変換する方法をです:

$dc = Read-Host "Which DC do you want?" 
& dsquery computer -name "${dc}VUT*" | % { 
    # Do your processing here... 
    $_ -replace '(CN=)(.*?),.*', '$2' 
} 
+0

出力が引用符で囲まれている場合にのみ動作します。私は、バッチファイルからpowershellコマンドを呼び出すために行う必要があると仮定します。 'powershell -command" Get-Content dsquery2.txt |%{$ _ -place}(。*?)、。* '、' $ 2 '} "' ' – Edwin

+0

@Edwin PowerShellを2つを混合するのではなく、人生ははるかに簡単だろう:-) –

+0

私は正直なところ、PowerShellについて何も知らない。ベストを尽くそうとするだけで、私が知っているものでできる限り速くできます。私はPowershellで全部試してみるつもりだし、私はそれを2人で動かすことができないようだ。 – Edwin

1

はあなたdsquery.txtに対してこれを実行し、それはあなたが必要なものを解析します。

@echo off 
setlocal enabledelayedexpansion 
::Echos your Computer Name only. 
for /F "tokens=1,2 delims==," %%G IN (dsquery.txt) DO echo %%H 
pause 
endlocal 

基本的には、サーバー名をすぐに囲む2つの異なるデリミタ「=」と「、」を使用します。その2番目のトークンだけを検索します。上記の文字列に基づいて動作します。

関連する問題