2017-04-24 10 views
0

以下のコードで、他の関数が空であると返す理由をFileArrayと返すと、なぜ理解できないのですか?返す方法別の関数powershellで使用する値

FileArrayでコピーファイルを使用したいと考えています。私はちょうど1つの巨大な機能にすべてのステップを置くはずですか?

function Import-Excel 
{ 
    param (
    [string]$FileName, 
    [string]$WorksheetName, 
    [bool]$DisplayProgress = $true 
) 

    if ($FileName -eq "") { 
    throw "Please provide path to the Excel file" 
    Exit 
    } 

    if (-not (Test-Path $FileName)) { 
    throw "Path '$FileName' does not exist." 
    exit 
    } 

    $FileName = Resolve-Path $FileName 
    $excel = New-Object -com "Excel.Application" 
    $excel.Visible = $false 
    $workbook = $excel.workbooks.open($FileName) 

    if (-not $WorksheetName) { 
    Write-Warning "Defaulting to the first worksheet in workbook." 
    $sheet = $workbook.ActiveSheet 
    } else { 
    $sheet = $workbook.Sheets.Item($WorksheetName) 
    } 

    if (-not $sheet) 
    { 
    throw "Unable to open worksheet $WorksheetName" 
    exit 
    } 

    $sheetName = $sheet.Name 
    $columns = $sheet.UsedRange.Columns.Count 
    $lines = $sheet.UsedRange.Rows.Count 

    Write-Warning "Worksheet $sheetName contains $columns columns and $lines lines of data" 

    $fields = @() 

    for ($column = 1; $column -le $columns; $column ++) { 
    $fieldName = $sheet.Cells.Item.Invoke(1, $column).Value2 
    if ($fieldName -eq $null) { 
     $fieldName = "Column" + $column.ToString() 
    } 
    $fields += $fieldName 
    } 

    $line = 2 


    for ($line = 2; $line -le $lines; $line ++) { 
    $values = New-Object object[] $columns 
    for ($column = 1; $column -le $columns; $column++) { 
     $values[$column - 1] = $sheet.Cells.Item.Invoke($line, $column).Value2 
    } 

    $row = New-Object psobject 
    $fields | foreach-object -begin {$i = 0} -process { 
     $row | Add-Member -MemberType noteproperty -Name $fields[$i] -Value $values[$i]; $i++ 
    } 
    $row 
    $percents = [math]::round((($line/$lines) * 100), 0) 
    if ($DisplayProgress) { 
     Write-Progress -Activity:"Importing from Excel file $FileName" -Status:"Imported $line of total $lines lines ($percents%)" -PercentComplete:$percents 
    } 
    } 
    $workbook.Close() 
    $excel.Quit() 
} 

function FindFiles { 

    param(
     [string]$fiestore 
    ) 

    $length = $filestore.Length 
    $GuidArray = @() 

    for($line=0;$line -le $filestore.Count;$line++){ 

      $check = $filestore[$line] 
      $length2 = $check.Length 
      echo $check 

      $fileGuid = $check | ForEach-Object{$_.FileGuid} 





      $GuidArray = $GuidArray + $fileGuid  
    } 

    write-host "-------------------------------------------------------------" -ForegroundColor Yellow 

    $filepath = Read-Host " Please Enter File Path to Search" 

    for ($counter=0;$counter -lt $GuidArray.Count;$counter++){ 
     $fileArray = @() 
     $guidcheck = $GuidArray[$counter] 
     echo $guidcheck 
     $file = Get-ChildItem -Recurse -Force $filePath -ErrorAction SilentlyContinue | Where-Object { ($_.PSIsContainer -eq $false) -and ($_.Name -like "*$guidcheck*") } | Select-Object Directory,Name| Format-Table -AutoSize 
     $fileArray += $file 
    } 
    echo $fileArray 

    return $fileArray 


} 

function CopyFiles { 

    param(
     [string]$filearray 
    ) 
    echo $fileArray 
    for($counter = 0;$counter -lt $filearrray.Count;$counter++){ 
     echo $filearray[$counter] 
     #Copy-Item 
    } 

} 

function execute { 
    $filestore = Import-Excel 'C:\594 Sample of Filestore.xlsx' 
    $fileArray = @() 
    FindFiles($filestore) 
    echo $fileArray 
    CopyFiles($fileArray) 
} 

答えて

1

$fileArrayReturnを行うことによって、関数の外で利用できるようになっていませんが、あなたは、グローバルスコープ(これはベストプラクティスではありませんが)とそれを定義することにより、関数の外でそれにアクセスできるようにできます。Return $Global:fileArray

代わりに、それはそうではあなたが行うことができます実行し、関数呼び出し自体の値になります:

$filestore = Import-Excel 'C:\594 Sample of Filestore.xlsx' 
$fileArray = @(FindFiles($filestore)) 
echo $fileArray 
CopyFiles($fileArray) 

私はあなたにもFindFiles機能の中から任意のecho文を削除する必要があるか、彼らがかもしれないと思うがまた戻った。

注:これはテストされていないコードです。

+0

ああ、変数内で関数を呼び出すだけで、変数の値が関数の結果になります。奇妙な! – goldenwest

+0

ありがとうございます – goldenwest

+1

基本的に標準出力に出力するコマンド(例えば 'write-output'や文字列の書き込み)は、関数の出力になります。 –

関連する問題