3

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

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

4

3 回答 3

3

您可以轻松地将Get-ChildItem(aliased as dir) 和Move-Item(aliased as mv) 链接到一条简单的行中执行移动。唯一真正的技巧是您需要指定-Destination参数(缩写为 -dest):

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

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

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

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

还值得注意的是,在 PowerShell v3 中,他们将-File和都添加-Directory到了Get-ChildItemcmdlet 中,从而可以轻松地完全跳过 where 子句,并让它最初进行过滤。

于 2013-08-18T04:02:25.193 回答
2

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

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

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

于 2013-08-17T19:56:59.920 回答
0

这应该做的工作:

Move-Item * childDir\

但它会给你一个错误,Move-Item : The process cannot access the file because it is being used by another process.因为它也试图将 childDir 移动到 childDir 中(但它不能这样做,因为它正在使用中)。

如果您不想看到错误(例如,您试图在错误很重要的 DevOps 管道中使用它),您可以使用:

Move-Item * childDir\ -ErrorAction Ignore

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

于 2020-11-30T17:25:25.823 回答