Как обрабатываются различные разделители пути?

Я хочу написать код, который работает на всех платформах PowerShell. Следующий код генерирует вывод с \ разделители путей в Windows и / разделители пути в Linux.

Get-ChildItem -File -Recurse | ForEach-Object { $_.FullName }

Я хочу исключить файлы, которые находятся под obj каталог. Количество и глубина obj каталоги не известны. Один из способов сделать это - отфильтровать тех, кто использует что-то вроде следующего. Однако это не будет работать в Linux, потому что разделитель пути отличается.

Get-ChildItem -File -Recurse | 
    Where-Object { -not ($_.FullName -like '*\obj\*' |
    ForEach-Object { $_.FullName }

Использование шаблона регулярных выражений, кажется, работает, но я хотел бы знать, есть ли более ясный способ сделать это. Я вижу это как неловко. Мало того, что \\ символ действителен как часть имени файла Linux, что может привести к уязвимости в этом коде.

Get-ChildItem -Recurse |
    Where-Object { -not ( $_.FullName -like "*[/\]obj[/\]*") } |
    ForEach-Object { $_.FullName }

2 ответа

Решение

Я бы предложил переложить ответственность за обработку символа разделителя каталогов на базовую платформу.Net. Что-то вроде этого:

Get-ChildItem -Recurse |
Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar) -notcontains "obj" } |
ForEach-Object { $_.FullName }

По крайней мере PowerShell v6.0.0-beta.2 $PSVersionTable имеет дополнительные свойства GitCommitId, OS и Platform, которые вы можете использовать, чтобы различать в своем коде, хотя предпочтительнее иметь только одну версию, как в ответе Михаила.

$PSVersionTable                                                                                                                  

Name                           Value                                                                                               
----                           -----                                                                                               
PSVersion                      6.0.0-beta                                                                                          
PSEdition                      Core                                                                                                
BuildVersion                   3.0.0.0                                                                                             
CLRVersion                                                                                                                         
GitCommitId                    v6.0.0-beta.2                                                                                       
OS                             Linux 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017                                  
Platform                       Unix                                                                                                
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                             
PSRemotingProtocolVersion      2.3                                                                                                 
SerializationVersion           1.1.0.1                                                                                             
WSManStackVersion              3.0  
Другие вопросы по тегам