使用PowerShell将空文件夹列表从一个卷移动到另一个卷

时间:2011-08-04 02:41:01

标签: windows powershell powershell-v2.0

我在具有最新服务包的Windows SBS 2008计算机上使用PowerShell 2.0。我有一个两行脚本,可以找到目录中的所有空文件夹:

$a = Get-ChildItem E:\File_Server -recurse | Where-Object {$_.PSIsContainer -eq $True}
$a | Where-Object {$_.GetFiles().Count -eq 0} | [what now?!]

第二行找到所有空的文件夹,但是我在最后一个管道上难倒。这是我到目前为止所尝试的内容(请记住,在上面第二行的第二个管道之后尝试了以下内容):

$_.move(F:\path)是的,我试过了。是的,我是PowerShell noob。当然,我收到错误“表达式只允许作为管道的第一个元素。”

move-item -destination F:\Path我收到了有史以来最蹩脚的错误:“Move-Item:源路径和目标路径必须具有相同的根。移动不会在卷上运行。”真的吗?什么样的asinine限制是什么?!继续......

copy-item -destination F:\empty_folders显然,我可以使用copy-item来解决move-item的限制,然后使用remove-item。然而,没有这样的运气。我先用copy-item启动了脚本。 PowerShell没有抛出任何错误,但也没有做任何其他事情。它只是坐在那里一小时的大部分时间。没有移动目录。

要点: 如何获取我拥有的空文件夹列表,使用PowerShell ,将这些空目录移动到其他地方(跨卷!),移动后删除原件?请注意警告“使用PowerShell”,因为我已经考虑过将RoboCopy添加到混合中,但是希望将其保留在PowerShell中。

1 个答案:

答案 0 :(得分:2)

我对此感到非常沮丧,但就像你说copy-item后跟remove-item一样有效:

gci e:\file_server | ?{$_.PSIsContainer -eq $true} | ?{$_.GetFiles().count -eq 0} | 
%{copy-item -LiteralPath $_.fullname -Destination f:\path; remove-item $_.fullname}

请注意,这不仅仅是对Move-Item和Powershell的限制,而是适用于.Net System.IO.Directory.Move,并且公平地说,文档是这样说的:

  

Move-Item将在文件支持的驱动器之间移动文件   相同的提供程序,但它只会在同一个目录中移动目录   驱动。

http://technet.microsoft.com/en-us/library/dd315310.aspx

PS:您收到了"Expressions are only allowed as the first element of a pipeline."错误,因为您尝试的$_.move(F:\path)必须位于foreach-object中,如此 - %{$_.move(F:\path)}