获取文件夹中所有文件夹、子文件夹和文件的相对路径

Get Relative paths of all the folders, sub-folders and files in a folder

我有一个名为 source 的文件夹。它的结构如下。

source\a.jpg
source\b.jpg
source\c.xml
source\d.ps1
source\subdir1\a.xml
source\subdir2\b.png
source\subdir3\subsubdir1\nothing.img

我想在文本文件中列出文件夹、子文件夹和文件的所有相对路径,比如 out.txt。对于上面的输出,我期望的是:

source\a.jpg
source\b.jpg
source\c.xml
source\d.ps1
source\subdir1\a.xml
source\subdir2\b.png
source\subdir3\subsubdir1\nothing.img
source\subdir1
source\subdir2
source\subdir3
source\subdir3\subsubdir1

您可以看到输出也包括单独的文件夹和子文件夹。

注意:我在源文件夹外的文件夹中。我的意思是,例如我在 fold 文件夹中,其中包含源文件夹 -> fold/source 但如果您的解决方案包括将脚本放入源文件夹中,那也很好。两种解决方案都很好。这可能很容易,但我不熟悉 powershell,但如果给定,至少可以 运行 从中获取脚本。

EDIT1: 好的,在 "duplicate question" 中答案是针对单个文件的相对路径。但我也想要文件夹和子文件夹。

EDIT2: 好的,我写了一个命令:

(gci -path source -recurse *.|Resolve-path -relative) -replace "","" | out-file -FilePath output.txt -Encoding ascii

现在,这个命令给我源内唯一子目录的相对名称(在我的实际源文件夹中具有不同的名称;源显然是一个虚拟名称!)。我应该在此代码中更改什么以获取源中子目录中文件的其他名称。

不是很干净,但这可能是一个选择。

(Get-ChildItem -Recurse -Path "C:\ABC\source\").FullName|ForEach{[Regex]::Replace($_,'^C:\ABC\','')}

这是干净的一行答案,我没有写循环,完美地完成了工作。有点侥幸"playing around"生产出来了

(gci -Path source -Recurse *.*|Resolve-Path -Relative) -replace "\.","" |
  Out-File -FilePath output.txt -Encoding ascii

我可能会这样做:

$source = 'C:\path\to\source'

$parent  = [IO.Path]::GetDirectoryName($source) -replace '\+$'
$pattern = '^' + [regex]::Escape($parent) + '\'

Get-ChildItem -Path $source -Recurse | % { $_.FullName -replace $pattern }