KennethD
KennethD

Reputation: 31

Powershell - GetChilditem grab first result

I have an issue with a powershell script i have made. The purpose of the script is to gather information from various ressources, CMDB og and other systems and gather them in a combined report and send it.

I have everything working just fine, except one single ting that keeps bothering me. In my script, i do a lot of parsing and trimming in the information i get, at in some functions i need to get some XML files. Example:

$filter = "D:\WEC\Script\Rapportering\BigFixData\"
$xmlfiles = Get-ChildItem -path $filter -Filter "Bigfix_trimmed_JN.xml" -Recurse -Force |where {$_.psIsContainer -eq $false } 
$xmlfile = $xmlfiles | ogv -OutputMode Single

There will always be only one file to grab, and thats why i use the Filter option and give the specific name. The code above will trigger a pop-up, asking me to select the file. It works fine except for the file picker popup. I want to get rid of that.

I then changed the code to this:

$filter = "D:\WEC\Script\Rapportering\BigFixData\"
$xmlfiles = Get-ChildItem -path $filter -Filter "Bigfix_trimmed_JN.xml" | Select-Object -First 1 |where {$_.psIsContainer -eq $false }

This no longer shows the popup, but it does not seem to select the file. Resulting in a referenceObject error later in the script, because it is null.

the script is about 1000 lines and i have narrowed the error down to the command aboove.

Can anyone help me figuring out what i do wrong?

Thanks in advance

Upvotes: 3

Views: 2440

Answers (2)

mklement0
mklement0

Reputation: 439487

  • Your 2nd command is missing the -Recurse switch, which may explain why you're not getting any result.

  • While it is unlikely that directories match with a filter pattern as specific as "Bigfix_trimmed_JN.xml", the more concise and faster way to limit matching to files only in PSv3+ is to use the -File switch (complementarily, there's also a -Directory switch).

$xmlfile = Get-ChildItem $filter -Filter Bigfix_trimmed_JN.xml -Recurse -File |
             Select-Object -First 1

You should add a check to see if no file was returned.

Upvotes: 7

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174760

If you want the first file, you'll need to filter out the directories before piping to Select-Object -First 1 - otherwise you run the risk of the first input element being a directory and your pipeline therefore evaluates to $null:

$xmlfiles = Get-ChildItem -path $filter -Filter "Bigfix_trimmed_JN.xml" | Where-Object {-not $_.PsIsContainer} | Select-Object -First 1

Upvotes: 0

Related Questions