在Powershell中,如何将文件夹中的所有文件移动到新的子目录?
我已经尝试了mv c:\foo\* c:\foo\bar\
,但我的所有文件都消失了,我得到了一个无扩展名'bar'文件。首先制作目录也不起作用,因为它会尝试将“bar”移动到自身。
答案 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
这正常工作,但是如果还有另一个意外错误,您可能看不到它。