Как обрабатываются различные разделители пути?
Я хочу написать код, который работает на всех платформах 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