繁体   English   中英

如何 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 

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

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

但是,为了让我生成的网页在我们的外联网上工作,我无法提供文件的完整路径。 我只需要它返回:

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

这将是我可以在外联网上使用的链接。 如何让 get-childitem 只返回子路径?

我的脚本是从

//server/group/Creds/Documents

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

简单的方法是简单地修剪不需要的路径,包括尾部斜杠:

$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)
}

.GetRelativePath() :在 PowerShell Core 中,底层 .NET Core 框架的System.IO.Path类型现在有一个.GetRelativePath()方法,这是一种通过引用路径从绝对路径获取相对路径的便捷方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM