如何返回值以在另一个函数powershell中使用

时间:2017-04-24 18:19:18

标签: powershell

在下面的代码中,我无法理解为什么当我返回FileArray时为什么我的其他函数将其返回为空?

我希望在FileArray中使用copyfiles。我是否应该将所有步骤放在一个巨大的功能中?

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 个答案:

答案 0 :(得分:1)

$fileArray通过执行Return在函数外部不可用,但您可以通过使用全局范围定义它来使其在函数外部可访问(尽管这不是最好的练习):Return $Global:fileArray

相反,它成为Function调用本身的值,因此在Execute中你可以这样做:

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

但是我认为您还需要从echo函数中删除任何FindFiles语句,否则它们也可能会被返回。

注意:这是未经测试的代码。