Windows Powershell - Връщането и предоставянето на променливи към функциите не работи

Имам проблем, надявам се някой да може да помогне с...

Имам следния код, който има потребителско меню и рекурсивно търси текстови файлове и файлове, съдържащи низа "hello", след което отпечатва html файл с резултатите:

Foreach ($Target in $Targets){     #ip address from the text file supplied

Function gettextfiles { 

    Write-Output "Collating Detail for $Target"

    $Results = Get-ChildItem -Path $Target -Recurse -Include *.txt
    Write-Output "output from recursively searching for text files $Results"
    $MyReport = Get-CustomHTML "$Target Audit"
    $MyReport += Get-CustomHeader0  "$Target Details"
    $MyReport += Get-CustomHeader "2" "Text files found"

    foreach ($file in $Results) {
        $MyReport += Get-HTMLDetail "Path to the file" ($file)
    }

    $MyReport += Get-CustomHeaderClose

    return $MyReport
}

Function gethello {
    $Results = Get-ChildItem -Path $Target -Recurse | Select-String -pattern hello | group path | select -ExpandProperty name
    Write-Output "output from recursively looking for the string hello $Results"

    $MyReport += Get-CustomHeader "2" "Hello Strings Found"

    foreach ($file in $Results) {
        $MyReport += Get-HTMLDetail "Path to the file" ($file)
    }

    $MyReport += Get-CustomHeaderClose

    return $MyReport
}

####################################################################
# To create the html document from the data gathered in the above functions

Function printeverything([string]$MyReport) {

    $Date = Get-Date
    $Filename = "C:\Desktop" + "_" + $date.Hour + $date.Minute + "_" + $Date.Day + "-" + $Date.Month + "-" + $Date.Year + $Date.Second + ".htm"
    $MyReport | out-file -encoding ASCII -filepath $Filename
    Write "HTML file saved as $Filename"

}
###################################################################
User input menu, call the functions the user chooses then when they press 3 creates the html file

do {
[int]$xMenuChoiceA = 0
while ( $xMenuChoiceA -lt 1 -or $xMenuChoiceA -gt 4 ){
Write-host "1. Get Text Files"
Write-host "2. Get Files With The String Hello"
[Int]$xMenuChoiceA = read-host "Please enter an option 1 to 4..." }
Switch( $xMenuChoiceA ){
  1{gettextfiles}
  2{gethello}
  3{printeverything "$MyReport"}
default{<#run a default action or call a function here #>}
}
} while ($xMenuChoiceA -ne 4) 

}  #ending bracket of Targets foreach

Проблемът, който имам:

С помощта на потребителското меню мога успешно да стартирам скрипта за намиране на текстови файлове и за намиране на файлове, съдържащи низа hello, всички намерени резултати се добавят към $MyReport с помощта на функции, които конструират html за html файла. ‹- Всичко това работи перфектно

Когато обаче се опитам да извикам функцията printeverything с променливата $MyReport, така че тя да създаде HTML файла вместо мен, това не работи.

Кодът за създаване на HTML файла работи перфектно, както го тествах, Вярвам, че проблемът е, че променливата $MyReport не се предава правилно на функцията printeverything, но не мога да разбера какво правя погрешно

Тъй като съм нов в Powershell, помощта ви за това ще бъде много оценена, благодаря


person yonetpkbji    schedule 21.08.2013    source източник


Отговори (1)


Във вашия do-while вид, $MyReport току-що се предава на метода print everything. Но в този момент няма да бъде в обхват, тъй като просто присвоявате на $MyReport в рамките на функциите.

Опитайте да използвате $MyReport като $script:MyReport навсякъде, така че да бъде в обхвата на скрипта. Това не е идеалното решение, но трябва да е достатъчно добро, за да започнете.

Също така, може да искате да прочетете повече за изхода на тръбопровода/функцията в powershell. Използвате го погрешно - http://stacktoheap.com/blog/2013/06/15/things-that-trip-newbies-in-powershell-pipeline-output/

person manojlds    schedule 21.08.2013
comment
Ще опитам това и със сигурност ще погледна връзката, която предоставихте... казахте, че това решение не е идеално, какъв би бил идеалният начин да направите това тогава? Благодаря за вашата помощ - person yonetpkbji; 21.08.2013
comment
@perl-user - Идеалният начин би бил да имате подходящ обхват и връщана стойност от функцията и да присвоите върнатата стойност на променлива във вашия локален обхват и да работите с това, като я предавате на други функции и т.н. - person manojlds; 21.08.2013
comment
Да, съгласен съм и това се опитвам да постигна. Опитвал съм да го направя по този начин няколко пъти, но все без успех. Не знам дали е нещо синтактично, което правя грешно, но не мога да го накарам да работи (мога да правя такива неща лесно в perl, но имам проблеми в powershell). Бихте ли могли да ми покажете пример как това ще бъде направено правилно, благодаря за помощта - person yonetpkbji; 21.08.2013