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

3
我有一个名为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,但如果给出脚本,我至少可以运行它们。
编辑1:好的,在“重复问题”中,答案是关于单个文件的相对路径。但我还想要文件夹和子文件夹。
编辑2:好的,我写了一个命令:
(gci -path source -recurse *.|Resolve-path -relative) -replace "","" | out-file -FilePath output.txt -Encoding ascii

现在,这个命令只给出源文件夹内子目录的相对名称(我的实际源文件夹有不同的名称,"source"只是一个虚假名称!)。我应该如何更改此代码以获取源文件夹中子目录中其他文件的名称?

@BaconBits:不,那不是重复的问题。那个问题将“给定”的绝对路径转换为相对路径。我的问题问的是其他事情。 - Manish Kumar Sharma
实际上,这正是你解决问题所需要的。你只需要在一个循环中使用它来处理所有的文件/文件夹,并使用Get-ChildItem命令。我建议你先运行Get-Help Get-ChildItem -Full命令,然后编写一些代码,如果你有需要帮助的代码,再回来寻求帮助。我们并不会为你编写代码,但如果你的代码出现错误而你又无法理解,我们会帮助你修复。你需要的工具有:Get-ChildItemForEachSet-Content,以及其他“重复”问题答案中的代码。 - TheMadTechnician
@TheMadTechnician:请查看编辑2。 - Manish Kumar Sharma
3个回答

3
这是一个干净简洁的回答,我没有费心去编写循环,它完美地完成了工作。我通过一点运气和“玩弄”得到了这个答案。
(gci -Path source -Recurse *.*|Resolve-Path -Relative) -replace "\.\\","" |
  Out-File -FilePath output.txt -Encoding ascii

1
不是很干净,但这可能是一个选项。
(Get-ChildItem -Recurse -Path "C:\ABC\source\").FullName|ForEach{[Regex]::Replace($_,'^C:\\ABC\\','')}

0

我可能会这样做:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接