Ответ 1
Так как ваш тип параметра string
, он принуждает объект info файловой системы к строке, когда вы не используете конвейер { Test-VEnv $_ }
. Если вы вызовете метод ToString()
объекта System.IO.FileInfo
или System.IO.DirectoryInfo
, вы увидите это. Когда вы используете конвейер, он связывает псевдоним fullname, предоставляя вам полный путь.
Вы можете видеть, что делает PowerShell для привязки входного объекта с помощью Trace-Command
. Вот пример того, как его использовать:
trace-command -name parameterbinding -expression {(dir C:\)[0] | ? {Test-VEnv $_}} -pshost
Вот важная часть вывода:
BIND arg [PerfLogs] to parameter [Path]
Executing DATA GENERATION metadata: [System.Management.Automation.ArgumentTypeConverterAttribute]
result returned from DATA GENERATION: System.String[]
COERCE arg to [System.String[]]
Parameter and arg types the same, no coercion is needed.
BIND arg [System.String[]] to param [Path] SUCCESSFUL
Test-Path
делает то же самое. Взгляните на эти три примера:
PS C:\Users\Andy> Test-Path (dir C:\)[0]
False
PS C:\Users\Andy> (dir C:\)[0] | Test-Path
True
PS C:\> Test-Path (dir C:\)[0]
True
-
Поскольку мой PWD не является
C:\
, я получаю FALSE, потому что объект DirectoryInfo преобразуется в строку (ToString()
), которая дает имя папки. Это связано с тем, что конвейер не использовался. -
Поскольку используется конвейер, он работает, потому что он привязан к PsPath с этим параметром:
[Parameter(ParameterSetName='LiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)] [Alias('PSPath')] [string[]] ${LiteralPath},
-
Поскольку каталог содержит папку, имя папки существует.
Вы можете попробовать псевдоним PsPath
для вашей привязки. Это то, что использует Test-Path
:
param (
[Parameter(Mandatory=$true, Position=0,
ValueFromPipeline=$True,
ValueFromPipelineByPropertyName=$true)]
[Alias('PsPath')]
[String[]] $Path
)
process {
foreach ($P in $Path) {
Get-Item $p
}
}
Некоторые тесты:
Set-Location C:\
Write-Host 1
Test-VEnv '.\Windows', '.\Program Files'
Write-Host 2
Test-VEnv (dir)
Write-Host 3
'Windows', 'Program Files' | Test-VEnv
Write-Host 4
dir | Test-VEnv
Вывод:
1
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 3/14/2012 3:41 AM Windows
d-r-- 3/24/2012 7:46 PM Program Files
2
d---- 2/18/2012 4:32 AM PerfLogs
d-r-- 3/24/2012 7:46 PM Program Files
d-r-- 3/25/2012 4:49 PM Program Files (x86)
d---- 3/9/2012 9:57 PM Python27
d-r-- 3/4/2012 8:11 PM Users
d---- 3/14/2012 3:41 AM Windows
-a--- 3/4/2012 8:45 PM 1024 .rnd
3
d---- 3/14/2012 3:41 AM Windows
d-r-- 3/24/2012 7:46 PM Program Files
4
d---- 2/18/2012 4:32 AM PerfLogs
d-r-- 3/24/2012 7:46 PM Program Files
d-r-- 3/25/2012 4:49 PM Program Files (x86)
d---- 3/9/2012 9:57 PM Python27
d-r-- 3/4/2012 8:11 PM Users
d---- 3/14/2012 3:41 AM Windows
-a--- 3/4/2012 8:45 PM 1024 .rnd