2011-08-10 8 views
2

昨日私は助けてくれました(特にシェイ!)、私は複数のスクリプトを思いついたので、今それらを1つにマージしています。複数のスクリプトをマージして出力を表示する機能を使用する方法

問題は、それらをすべて「関数」に入れて、1つの関数が修正プログラムの正常なチェックに依存していることです。修正プログラムがインストールされていない場合、スクリプトが正しく停止してから停止する必要がありますスクリプトのチェックを行います。どのようにして次の関数を呼び出して、修正プログラム関数の正常な出力を呼び出すのですか?

また、私はどのように関数を呼び出すのか分かりません。つまり、関数の名前を1行ずつ続けて繰り返しますが、何度も何度もループしてしまいました。

誰かが助けてくれることを願っています。

Write-Host "==================================" 
Write-Host "Pre-Staging Script for DFSR Server" 
Write-Host "==================================" 

Function Service 
{ 
    Write-Host "==================================" 
    Write-Host "Checking Service Installation" 
    Write-Host "==================================" 

    write-host "This will check if Hotfix KB979808 is installed." -ForegroundColor Black -BackgroundColor Cyan 
    write-host "This is required for Windows Server 2008 R2 Robocopying" -ForegroundColor Black -BackgroundColor Cyan 
    Write-Host "" 

    $hotfix1 = Get-HotFix -id KB979808 -ErrorAction SilentlyContinue 

     If($hotfix1) 
     { 
      Write-Host "Hotfix is installed you may proceed" -foregroundcolor "green" 
      Write-Host "" 
     } 
    else 
     { 
     Write-Host "Hotfix is NOT installed - Please ensure you install this hotfix BEFORE" -ForegroundColor "red" 
     Write-host "Copying any data" -foregroundcolor "red" 
     Write-Host "" 
     } 
} 

Function Robocopy ($hotfix1) 
{ 
    Write-Host "=============" 
    Write-Host "Robocopy Data" 
    Write-Host "=============" 

    $Source = Read-Host "Please enter path of SOURCE" 
    $Destination = Read-Host "Please enter path of TARGET" 

    $Output = Read-Host "Please enter where to place output file eg c:\temp\COPY.log" 

    robocopy $Source $Target /b /e /copyall /r:1 /xd dfsrprivate /log:$Output /tee 
} 

Function Comparision 
{ 
    Write-Host "===============================================" 
    Write-Host "Checking Directory Count and Folder comparision" -ErrorAction SilentlyContinue -BackgroundColor Cyan -ForegroundColor Black 
    Write-Host "===============================================" 
    Write-Host "" 

    $Source = Read-Host "Please enter Source directory to check" 
    $Target = Read-Host "Please enter Target directory to check" 
    Write-Host "" 
    If($source -and (Test-Path -Path $source -PathType Container)) 
    { 
     "There are $(@(Get-ChildItem $Source).Count) items in the '$Source' directory" 
    } 
    Else 
    { 
     Write-Host "Please enter a directory" 
     } 
     If($source -and (Test-Path -Path $Target -PathType Container)) 
     { 
      "There are $(@(Get-ChildItem $Target).Count) items in the '$Target' directory" 
    } 
    Else 
    { 
     Write-Host "Please enter a directory" 
    } 

    Write-Host "" 
    $child1 = Get-ChildItem -Path $Source -Recurse -Force 
    $child2 = Get-ChildItem -Path $Target -Recurse -Force 

    Compare-Object $child1 -DifferenceObject $child2 -Property Name 

    Write-Host "" 
    Write-Host "NOTE:" -BackgroundColor Cyan -ForegroundColor Black 
    Write-Host "Any symbols with '=>' mean that the file Does NOT exist in SOURCE but is in the Target" -BackgroundColor Cyan -ForegroundColor Black 
    Write-Host "Any symbols with '<=' mean that the file Does NOT exist in TARGET but is in the Source" -BackgroundColor Cyan -ForegroundColor Black 
} 

答えて

3

Serviceの修正プログラムを使用するには、修正プログラムを変数に戻す必要があります。関数は次のようになります。

Function Service 
{ 
    Write-Host "==================================" 
    Write-Host "Checking Service Installation" 
    Write-Host "==================================" 

    write-host "This will check if Hotfix KB979808 is installed." -ForegroundColor Black -BackgroundColor Cyan 
    write-host "This is required for Windows Server 2008 R2 Robocopying" -ForegroundColor Black -BackgroundColor Cyan 
    Write-Host "" 

    # This will return any output. 
    Get-HotFix -id KB979808 -ErrorAction SilentlyContinue 

} 

次に、関数呼び出しは次のようになります。それは機能のどこに使われていないですので、

$hotfix = Service 
if($hotfix) { 
    Robocopy 
} 
else { 
    # This will exit the script. 
    return 
} 

機能Robocopyは、パラメータとして$hotfix1を必要としません。

robocopy.exeの呼び出しがRobocopy関数と同じであるため、Robocopy関数がループしている可能性があります。 robocopy.exe呼び出しに ".exe"を追加してみてください。目的を正確に反映するために関数に名前を付けることが重要です。 ServiceGet-HotFixKB979808RobocopyStart-MyRobocopy

あなたの機能は非常に具体的なことを行うため、すべてのことを言って、彼らは本当に自分自身の関数である必要はありません可能性がある可能性があります。パラメータを受け入れることによって、それらを再利用可能に変更することができます。

+0

絶対に幻想的!私はスクリプトを変更して実行し、すべて正常に動作しました。 1つの質問 - パラメータを受け入れるようにスクリプトを変更するにはどうすればいいですか?.....読み込みがあるかもしれません。 – lara400

+0

'function MyRobocopy($ Sorce、$ Target){robocopy $ Source $ Target/b/e/copyall/r:1/xd dfsrprivate/log:$ Output/tee'となります。あなたは 'MyRobocopy C:\ Temp \ MyFolder D:\ Temp \ MyFolder'のように呼び出すでしょう。関数の詳細については 'help about_functions'を見てください。 – Rynant

関連する問題