Powershell:将指定目录中的所有文件放入单独的、唯一命名的子目录中

Powershell: Place all files in a specified directory into separate, uniquely named subdirectories

我有一个现有目录,比方说 "C:\Users\Test",其中包含文件(具有各种扩展名)和子目录。我正在尝试编写一个 Powershell 脚本,它将 "C:\Users\Test" 中的每个文件放入一个唯一命名的子目录中,例如“\001”、“\002”等,同时忽略其中的任何现有子目录和文件.示例:

在 运行ning 脚本之前:

C:\Users\Test\ABC.xlsx
C:\Users\Test\QRS.pdf
C:\Users\Test\XYZ.docx
C:\Users\Test\Folder1\TUV.gif

在 运行ning 脚本之后:

C:\Users\Test[=11=]1\ABC.xlsx
C:\Users\Test[=11=]2\QRS.pdf
C:\Users\Test[=11=]3\XYZ.docx
C:\Users\Test\Folder1\TUV.gif

注意: 每次脚本在一批文件上 运行 时,名称、扩展名和文件数量都会有所不同。文件放入新编号的子目录中的顺序并不重要,只是每个子目录都有一个简短、唯一的名称。我有另一个脚本,它将对所有子目录应用一致的顺序命名约定,但首先我需要将所有文件放入单独的文件夹,同时保持它们的本机文件名。

这是我目前所处的位置:

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MD ($_.root +($id++).tostring('000'));
MV $_ -Destination ($_.root +(001+n))
}

MD 表达式成功创建了子目录,但我不确定如何编写 MV 表达式才能真正将文件移动到子目录中。我写了 (001+n) 来说明我要使用的概念,其中 n 将从 0 递增到文件总数。或者可能需要一种完全不同的方法。

$id = 1
Get-ChildItem C:\Test\ -file  | % {
    New-Item -ItemType Directory -Path C:\Test -Name $id.tostring('000')
    Move-Item $_.FullName -Destination C:\Test$($id.tostring('000'))
    $id++
}

Move-Item 就是您要找的。

好的,我想我明白了。 运行 以下脚本按顺序产生所需的结果。诀窍是在 运行 MV 表达式时重置 $id 增量。不过,这可能可以改进,所以如果您有更好的方法,请告诉我!已编辑:@ArcSet 在单个脚本中提供了更好的答案!谢谢!

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MD ($_.root +($id++).tostring('000'))
}

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MV $_ -Destination($_.root +($id++).tostring('000'))
}