Используйте значения из функции и передайте ее другой функции - PullRequest
3 голосов
/ 18 августа 2011

У меня есть две нижеприведенные функции, и я хочу, чтобы ИСТОЧНИК и ЦЕЛЬ функции ROBOCOPY использовались в функции сравнения.Может кто-нибудь сказать мне, как это сделать, пожалуйста.Спасибо.

Write-Host "==================================" -ForegroundColor Magenta -BackgroundColor White
Write-Host "Pre-Staging Script for DFSR Server" -ForegroundColor Magenta -BackgroundColor White
Write-Host "==================================" -ForegroundColor Magenta -BackgroundColor White
Write-Host ""
Function GetHot-Fix
{
                Write-Host "==================================" -ForegroundColor Magenta -BackgroundColor White
                Write-Host "Checking Service Installation" -ForegroundColor Magenta -BackgroundColor White
                Write-Host "==================================" -ForegroundColor Magenta -BackgroundColor White
                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 ""

                Get-HotFix -id KB979808 -ErrorAction SilentlyContinue

}

Function Start-MyRobocopy($source,$Target)
{
                Write-Host "=============" -ForegroundColor Magenta -BackgroundColor White
                Write-Host "Robocopy Data" -ForegroundColor Magenta -BackgroundColor White
                Write-Host "=============" -ForegroundColor Magenta -BackgroundColor White
                Write-Host ""

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

                If ($Source -and (Test-Path -Path $Source -PathType Container))
                {
                                $Target = Read-Host "Please enter path of TARGET"
                }
                Else
                {
                Write-Host "Please enter a directory"
                }
                                If ($Target -and (Test-Path -Path $Target -PathType Container))
                                {
                                $Output = Read-Host "Please enter where to place output file eg c:\temp\COPY.log"
                                }
                                Else
                                {
                                Write-Host "Please enter a directory"
                                }


robocopy.exe $Source $Target /b /e /copyall /r:1 /xd dfsrprivate /log:$Output /tee
}
Function Comparision
{
                Write-Host ""
                Write-Host ""     
                Write-Host "===============================================" -ForegroundColor Magenta -BackgroundColor White
                Write-Host "Checking Directory Count and Folder comparision" -ErrorAction SilentlyContinue -ForegroundColor Magenta -BackgroundColor White
                Write-Host "===============================================" -ForegroundColor Magenta -BackgroundColor White
                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
}


$hotfix = GetHot-Fix
If ($hotfix) {
                Write-Host "Hotfix installed" -BackgroundColor Green -ForegroundColor Black
                Write-Host ""
                Write-Host "Proceeding with Robocopy...."
                Write-Host "............................"
                Write-Host ""
                Start-MyRobocopy
                }
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 ""
                                return
                }

Comparision

Ответы [ 3 ]

10 голосов
/ 19 августа 2011

Переменные в powershell являются контекстно-зависимыми. Если я определю функцию как:

$bar = "Hi"
function foo {
   $bar = "Hey!"
}
$bar <-- returns "Hi"

Тогда переменная $ bar недоступна для меня вне этой функции. Чтобы сделать переменные доступными вне функций, вы можете контролировать область действия функции. Если я установлю переменную в функции, используя скрипт или глобальный префикс, тогда переменная будет доступна для всего скрипта или глобально в пространстве выполнения powershell. Смотрите здесь:

function foo {
   $script:fooVar = "world"
}

function bar {
   foo
   $global:barVar = "Hello " + $fooVar
}

Переменная $ fooVar в функции foo будет доступна всем другим функциям в сценарии благодаря сценарию префикса области действия переменной $ fooVar. Функция barVar будет доступна глобально в пространстве выполнения. То есть когда ваш сценарий завершен, переменная все еще присутствует в командной строке и даже в других сценариях.

Как вы можете видеть в функции bar, я сначала вызываю foo, а затем использую переменную foovVar. Когда я использую переменную $ fooVar, мне не нужно указывать $ script: fooVar, я могу, если захочу, но это не обязательно.

Это все допустимые переменные:

$aaa = 123
$script:bbb = 123
$global:ccc = 123 

Так что в вашем случае используйте $ script: source и $ script: target или $ global: source и $ global: target. Для получения дополнительной информации выполните следующую команду:

Help About_Scope
1 голос
/ 19 августа 2011

хакерский способ - добавить это к вершине:

$Gobal:source = ""
$Gobal:target = ""

, найдите и замените $ source на $ Gobal: source и $ target на $ Gobal: target - тогда вы можете использовать эти новые глобальные переменные в любой точке скрипта.

Как и предполагалось, вы можете защитить их в другой функции, но для простой задачи \ автоматизированной задачи, которая может быть излишней. Зависит от того, для чего это.

0 голосов
/ 18 августа 2011

У вас есть несколько вариантов. Два из них являются глобальным состоянием (имеют $ source и $ target, объявленные в области видимости файла, и обе функции используют их), и для сравнения их принимают в качестве параметров. Учитывая, что ваша функция robocopy запрашивает у пользователя источник и цель, если они нулевые, то глобальное состояние является самым простым решением. Лично я, вероятно, написал бы третью функцию, которая называется что-то вроде Get-SourceAndTarget, которая обрабатывает эту часть и выводит источник и цель, чтобы вы могли передавать их как в Start-MyRobocopy, так и в Comparison. Я не очень хорошо взламываю на PowerShell, так что я немного не уверен в синтаксисе, но это, вероятно, поможет вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...