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

时间:2015-05-27 02:07:42

标签: powershell relative-path

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

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:好的,在"重复的问题"答案是针对单个文件的相对路径。但我也想要文件夹和子文件夹。

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

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

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

3 个答案:

答案 0 :(得分:2)

这是干净的一行答案,我没有循环写,这完美地完成了工作。我是靠运气制作的,然后玩#34;一点。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我可能会这样做:

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

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

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