Сделайте ваш -Path
Параметр объектом System.IO.FileInfo
и просто передайте относительный путь в качестве параметра. Файловый объект разрешается с относительным или полным путем, тогда вы можете использовать $path.FullName
для ссылки на полный путь к файлу.
Function Get-FilePathItemHC {
Param (
[Parameter(Mandatory)]
[ValidateScript({ $_.Exists })]
[System.IO.FileInfo]$Path
)
# The ValidateScript attribute makes sure the file you passed in exists
# so your validation code no longer is required
}
Если вы хотите обрабатывать как каталоги, так и файлы, вы быв этом случае нужно иметь две отдельные переменные, поскольку пути к каталогам станут объектом System.IO.DirectoryInfo
, но вы можете сделать аргументы взаимоисключающими:
Function Get-FilePathItemHC {
Param (
[Parameter(Mandatory=$true, ParameterSetName="FilePath")]
[ValidateScript({ $_.Exists })]
[System.IO.FileInfo]$FilePath,
[Parameter(Mandatory=$true, ParameterSetName="DirectoryPath")]
[ValidateScript({ $_.Exists })]
[System.IO.DirectoryInfo]$DirectoryPath
)
$Path = $FilePath
if( $DirectoryPath ) {
$Path = $DirectoryPath
}
# The ValidateScript attribute makes sure the file you passed in exists
# so your validation code no longer is required
}
Get-FilePathItemHC -Path .\path\to\file.txt
Получить относительный путь из $PSScriptRoot
Я не уверен, зачем вам нужен путь относительно $PSScriptRoot
, если у вас уже есть полный путь к файлу, но после получения объекта System.IO.FileInfo
или System.IO.DirectoryInfo
вы можете использовать Resolve-Path
из $PSScriptRoot
чтобы получить относительный путь из этого каталога:
$file = Get-FilePathItemHC -Path .\path\to\file.txt
Push-Location $PSScriptRoot
$relativeFromScriptRootPath = Resolve-Path -Relative $file
Pop-Location
Push-Location
и Pop-Location
обрабатывают местоположение как стек. Операция push
устанавливает новое местоположение и добавляет его в стек, а операция pop
удаляет последнее добавленное местоположение из стека и помещает вас в следующее самое последнее местоположение. Работает немного как cd -
в Linux, если вы знакомы.
Resolve-Path
вернет путь к файлу, а переключатель -Relative
вернет путь относительно вашего текущего каталога. Вы не можете передать альтернативный каталог для разрешения, поэтому мы меняем место для его запуска.