Как Get-Childitem и включать только подпапки и файлы? - PullRequest
1 голос
/ 05 апреля 2019

У меня есть скрипт, и в настоящее время я делаю следующее, который получает полный путь к файлам в подкаталоге:

$filenameOut = "out.html"

#get current working dir
$cwd = Get-ScriptDirectory 

#get files to display in lists
$temp = Join-Path $cwd "Initial Forms"
$temp = Join-Path $temp "General Forms"
$InitialAppointmentGenArr = Get-ChildItem -Path $temp 

Так что это вернет список, в котором выглядит первый файл в массивенапример:

"//server/group/Creds/Documents/Initial Forms/General Forms/Background Check.pdf"

Однако, чтобы моя сгенерированная веб-страница работала в нашей экстрасети, я не могу указать полный путь к файлу.Мне просто нужно это вернуть:

"Initial Forms/General Forms/Background Check.pdf"

Это будет ссылка, которую я могу использовать в экстрасети.Как мне получить get-childitem, чтобы он возвращал только подпуть?

Мой скрипт запускается с

//server/group/Creds/Documents

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

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Я предлагаю следующий подход:

$relativeDirPath = Join-Path 'Initial Forms' 'General Forms'

Get-ChildItem -LiteralPath $PSScriptRoot/$relativeDirPath | ForEach-Object {
  Join-Path $relativeDirPath $_.Name
}

Обратите внимание, что я использовал $PSScriptRoot вместо $cwd, так как похоже, что последний содержит каталог, в котором находится ваш скрипт,какая автоматическая переменная $PSScriptRoot напрямую сообщает.

Вот обобщенный вариант, который также работает с рекурсивным использованием Get-ChildItem:

$relativeDirPath = Join-Path 'Initial Forms' 'General Forms'

Get-ChildItem -LiteralPath $PSScriptRoot/$relativeDirPath | ForEach-Object {
  $_.FullName.Substring($PSScriptRoot.Length + 1)
}

Какв сторону: в PowerShell Core базовый тип .NET Core Framework System.IO.Path теперь имеет метод .GetRelativePath() , который является удобным способом получения относительного пути из абсолютногопо ссылочному пути:

# PowerShell *Core* only.
PS> [IO.Path]::GetRelativePath('/foo/bar', '/foo/bar/bam/baz.txt')
bam/baz.txt
0 голосов
/ 05 апреля 2019

Простой способ - просто обрезать ненужный путь, включая косую черту:

$filenameOut = "out.html"

#get current working dir
$cwd = Get-ScriptDirectory 

#get files to display in lists
$temp = Join-Path $cwd "Initial Forms"
$temp = Join-Path $temp "General Forms"

$FullPath = Get-ChildItem -Path $temp 
$InitialAppointmentGenArr = $FullPath | %{ $_.FullName.Replace($cwd + "\","")}
...