Using a Foreach loop with a single-object array

Welcome Forums General PowerShell Q&A Using a Foreach loop with a single-object array

Viewing 4 reply threads
  • Author
    Posts
    • #34598
      Participant
      Topics: 2
      Replies: 5
      Points: 0
      Rank: Member

      I use this function to input a string, search through every script module in my $pshome, and then offer up one or more finds for addition as an ISE script tab. Each function I write is a separate file with a name matching the function.

      However, it fails if only one matching file is found. Works fine if I select two or more files.

      If someone could just tell me what I am doing wrong.

      #requires -Version 2
      function Get-FunctionFileName 
      {
           Get-FunctionFileName -Name Get-NIC 
                  .EXAMPLE
                  PS C:\ref> Get-FunctionFileName -Name .\Get-NIC.ps1
      
                  This works ok as well. The function removes '.\' and '.ps1' 
          
          #>
        
          [CmdletBinding()]
          param(
        
              [Parameter(ValueFromPipeline = $true,
                      ValueFromPipelineByPropertyName = $true)]
              [String]
          $Name = 'TBAppointment'
          #     $Name = 'functionfilename'
          #     $Name = 'Get-Diskspace'
          
          )
          
          $Start = $PWD
          $ArrayofPaths = @( $env:PSModulePath -split ';')
          $Collection = @()
          
          if ( $fn )  {Remove-Variable -Name fn -Scope Global -ea Continue}
          $fn =@()
      
          $Name = $Name -replace '\.\\', ''
          $Name = $Name -replace '\.ps1', ''
        
          foreach ($dir in $ArrayofPaths) 
          {
              Write-Verbose -Message $dir 
              $Collection += Get-ChildItem -Path $dir -Include "*$Name*" -Recurse | Where-Object -FilterScript {$_.PSIsContainer -eq $false}
          } #end foreach
          
          if (-not( $Collection)) 
          {
              Write-Warning -Message 'No Results were found!'
              break
          }
      
          [array]$Results = $Collection | Select-Object -Property BaseName, LastWriteTime, Length, Fullname, 
          @{ Name = 'Module'; Expression = {Split-Path -Path $_.Directory -Leaf}    }
      
          
          $Results | Format-Table -AutoSize -Property @{Name = 'Index';Expression = {[array]::IndexOf($Results, $_)}}, BaseName, LastWriteTime, Length, Fullname
        
          [array]$Choice = Read-Host -Prompt 'Please Choose by Index Number(s)' 
      
          $Choice = $Choice -split {$_ -eq ' ' -or $_ -eq ','} |
          Where-Object   -FilterScript {$_} |
          ForEach-Object -Process {$_.trim()} 
      
          Foreach ($Ch in $Choice) 
          {
              $fn = $fn+ $Results[$Ch].fullname
          }
      
          if ( -Not($fn)) {Write-Warning '$FN was not set'}
        
          foreach ($file in $fn ) {$file ; psEdit -filenames $file }
      }
      
    • #34605
      Participant
      Topics: 2
      Replies: 376
      Points: 1
      Rank: Member

      You forget to say in which line you get an error, what error and what version of PS you are using.
      line
      $Choice = $Choice -split {$_ -eq ' ' -or $_ -eq ','} | looks very strange. You should read more about -split
      tip1: $choice -split ‘[ ,]’
      tip2: try to output significant variable values just before line with error

    • #34687
      Participant
      Topics: 2
      Replies: 5
      Points: 0
      Rank: Member

      Well, there really is no error. It just fails to use the elements in the $Choice array

      Foreach ($Ch in $Choice)

      If $Choice has only one element (and I definitely define an array ) this foreach loop fails to build $fn. I had once defined it as $fn += $Results[$Ch].fullname. However, the different methods don’t appear to matter.

      I see your point about the split, but I don’t know why that would affect the above foreach loop. In the final line, I do output each element of $fn as ‘$file’ in the last code line. The string is displayed in the host before it is opened in the script editor.

    • #34699
      Participant
      Topics: 2
      Replies: 376
      Points: 1
      Rank: Member

      sorry, I can’t reproduce your problem.
      I try your code, find many files and choose one from them, find only one file and choose one successfully, find many and choose many…
      only the change I make – comment out #PSEdit
      but I get all chosen names with
      foreach ($file in $fn ) {$file}

      I use PSv5

    • #34707
      Participant
      Topics: 2
      Replies: 5
      Points: 0
      Rank: Member

      Max,

      Thanks for the effort. I forgot to mention that I was using this with v5 at home and v2 in the office. If i was above v3 everywhere, i would send everything to outgridview.

      Such as,

      $FN = $choices | out-gridview -passthrough | select -expandproperty Fullname

      and then send the contents $FN to a script tab(s) via psedit.

      I have run this without my profile and still get the same problem.

      Maybe, I will experiment with $psISE.CurrentPowerShellTab until I discover the true problem.

Viewing 4 reply threads
  • The topic ‘Using a Foreach loop with a single-object array’ is closed to new replies.