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
可用于确定完整的文件系统本机路径。
我有一个脚本,目前我执行以下操作,获取子目录中文件的完整路径:
$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
可用于确定完整的文件系统本机路径。