Get-Childitem如何只包含子文件夹和文件?

How Get-Childitem and only include subfolders and files?

我有一个脚本,目前我执行以下操作,获取子目录中文件的完整路径:

$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 

所以这将 return 一个列表,其中数组中的第一个文件如下所示:

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

但是,为了让我生成的网页在我们的酒店外联网上运行,我无法提供文件的完整路径。我只需要它 return:

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

这将是我可以在酒店后台使用的 link。如何将 get-childitem 获取到 return 只是子路径?

我的脚本是 运行 来自

//server/group/Creds/Documents

我找不到与此类似的示例。我也想避免对脚本位置进行硬编码,以防它被移动。

简单的方法是 trim 不需要的路径包括尾部斜线:

$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 + "\","")}

我建议采用以下方法:

$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) 7+版本中,底层.NET Core框架的System.IO.Path类型现在有一个.GetRelativePath() method,这是一种方便的获取方式来自绝对路径的相对路径,通过参考路径:

# PowerShell (Core) 7+ only.
PS> [IO.Path]::GetRelativePath('/foo/bar', '/foo/bar/bam/baz.txt')
bam/baz.txt

注:

  • 由于 .NET 的工作目录通常不同于 PowerShell 的工作目录,因此请务必提供完整 输入路径。

  • 此外,请确保路径是 文件系统本机 路径,而不是基于仅限 PowerShell 的驱动器。

  • Convert-Path 可用于确定完整的文件系统本机路径。