Context:
You can pass the result of Get-ChildItem
into Get-Content
directly:
PS /home/satob/tmp> Get-ChildItem | Where-Object { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_ } "a","x" "b","2" ...
Problem:
You cannot pass the result of Get-ChildItem
into Get-Content
directly when you Get-ChildItem
from other than current directory:
PS /home/satob> Get-ChildItem /tmp | Where-Object { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_ } Get-Content : Cannot find path '/home/satob/foobar.csv' because it does not exist. At line:1 char:80 + ... -Object { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_ } + ~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/satob/foobar.csv:String) [Get-Content], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
It is troublesome because the problem will not occur when you test with the files in current directory.
Reason:
The result of Get-ChildItem
is handled as relative path when you pass them to Get-Content
.
Note: The problem will not occur even without FullName
when you use wildcard with Get-ChildItem
.
PS /home/satob> Get-ChildItem tmp/*.csv | ForEach-Object { Get-Content $_ } "a","x" "b","2" ...
Solution:
You should specify FullName
property explicitly:
PS /home/satob> Get-ChildItem tmp/ | Where-Object { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_.FullName } "a","x" "b","2" ...
You can also use FullName
property with wildcards:
PS /home/satob> Get-ChildItem tmp/*.csv | ForEach-Object { Get-Content $_.FullName } "a","x" "b","2" ...
Note: You should not use Name
property with or without wildcards. It contains relative path:
PS /home/satob> Get-ChildItem tmp/ | Where-Object { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_.Name } Get-Content : Cannot find path '/home/satob/a.csv' because it does not exist. At line:1 char:80 + ... ct { $_.Name -like "*.csv" } | ForEach-Object { Get-Content $_.Name } + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/satob/a.csv:String) [Get-Content], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
PS /home/satob> Get-ChildItem tmp/*.csv | ForEach-Object { Get-Content $_.Name } Get-Content : Cannot find path '/home/satob/a.csv' because it does not exist. At line:1 char:44 + Get-ChildItem tmp/*.csv | ForEach-Object { Get-Content $_.Name } + ~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (/home/satob/a.csv:String) [Get-Content], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand