在 Powershell 中,如何将文件夹中的所有文件移动到新的子目录?
我试过 mv c:\foo\* c:\foo\bar\
,但我所有的文件都消失了,我得到了一个无扩展名的“bar”文件。首先创建目录也不起作用,因为它会尝试将“bar”移动到自身。
在 Powershell 中,如何将文件夹中的所有文件移动到新的子目录?
我试过 mv c:\foo\* c:\foo\bar\
,但我所有的文件都消失了,我得到了一个无扩展名的“bar”文件。首先创建目录也不起作用,因为它会尝试将“bar”移动到自身。
您可以轻松地将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-Object
cmdlet 考虑。该PSIsContainer
属性是添加到文件系统对象的特殊注释属性,可轻松将某些内容识别为文件夹(或不是)。
还值得注意的是,在 PowerShell v3 中,他们将-File
和都添加-Directory
到了Get-ChildItem
cmdlet 中,从而可以轻松地完全跳过 where 子句,并让它最初进行过滤。
这应该做你想要的。创建一个名为$myDir
first 的变量,该变量具有所需父目录的完整路径。
New-Item $myDir"\TestDirectory" -type directory
$files = Get-ChildItem $myDir\*.*
Move-Item $files $myDir"\TestDirectory"
使用单个*
也将选择子目录,如果您无意中选择了要移动的新目录并且也作为同一操作中的目标,这可能是您的问题的一部分。 *.*
应该匹配文件。一旦你对他们正在做的事情感到满意,请随意压缩这些陈述。
这应该做的工作:
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
这可以正常工作,但如果有另一个意外错误,您可能看不到它。