将文件夹中的所有文件移动到新的子目录

时间:2013-08-17 17:12:40

标签: windows powershell

在Powershell中,如何将文件夹中的所有文件移动到新的子目录?

我已经尝试了mv c:\foo\* c:\foo\bar\,但我的所有文件都消失了,我得到了一个无扩展名'bar'文件。首先制作目录也不起作用,因为它会尝试将“bar”移动到自身。

3 个答案:

答案 0 :(得分:3)

您可以轻松地将Get-ChildItem(别名为dir)和Move-Item(别名为mv)链接起来,以便在一个简单的行中执行移动。唯一真正的诀窍是你需要指定-Destination参数(缩写为-dest):

dir c:\foo\* | mv -dest c:\foo\bar

还有一件值得注意的事情,你可能想要过滤目录 - 在你的案例栏中嵌套在foo下 - 尝试将其移动到自身是没有意义的,你将得到一个错误。如果您需要过滤掉目录,只需将其通过Where-Object(别名为?)cmdlet进行管道传输:

dir c:\foo\* | ? {-not $_.PSIsContainer} | mv -dest c:\foo\bar

$_是一个自定义变量,指向Where-Object cmdlet考虑的管道中的每个对象。 PSIsContainer属性是添加到文件系统对象的特殊注释属性,可以轻松地将某些内容标识为文件夹(或不是)。

同样值得注意的是,在PowerShell v3中,他们将-File-Directory添加到Get-ChildItem cmdlet,这样可以轻松地完全跳过where子句并让它进行过滤最初

答案 1 :(得分:2)

这应该做你想要的。首先创建一个名为$myDir的变量,该变量具有所需父目录的完整路径。

New-Item $myDir"\TestDirectory" -type directory
$files = Get-ChildItem $myDir\*.*
Move-Item $files $myDir"\TestDirectory"

使用单个*也会选择子目录,如果您无意中选择了要移动的新目录,并且还作为同一操作中的目标,则可能是您的问题的一部分。 *.*应匹配文件。一旦你对他们所做的事情感到满意,请随意压缩这些陈述。

答案 2 :(得分:0)

这应该可以完成工作:

Move-Item : The process cannot access the file because it is being used by another process.

但是它会给您类似Move-Item * childDir\ -ErrorAction Ignore 的错误,因为它还会尝试将childDir移入childDir内(但它无法使用,因为它正在使用中)。

如果您不想看到该错误(例如,您尝试在存在错误的DevOps管道中使用该错误),可以使用:

Nanyang Business  School

这正常工作,但是如果还有另一个意外错误,您可能看不到它。