【问题标题】:Move list of empty folders from one volume to another with PowerShell使用 PowerShell 将空文件夹列表从一个卷移动到另一个卷
【发布时间】:2011-08-04 02:41:00
【问题描述】:

我在装有最新服务包的 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 菜鸟。当然,我收到了错误“表达式只允许作为管道的第一个元素。”

move-item -destination F:\Path 我收到了有史以来最糟糕的错误:“移动项目:源路径和目标路径必须具有相同的根。移动将无法跨卷工作。”严重地?那是什么白痴限制?!继续……

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

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

【问题讨论】:

  • 你是故意避开foreachForEach-Object吗?
  • 您是否希望为目标位置的空文件夹维护相同的目录结构?如果是这样,您如何知道路径中的父文件夹是否包含任何文件?例如,如果您有 c:\folder1\folder2\folder3\folder4 和 folder1 和 folder2 包含文件,但 folder3 和 folder4 没有,文件夹 3 是否算作“空”文件夹?
  • @jscott 我的印象是ForEach-Object 是不必要的,因为Where-Object 一次只喂下一个管道项目。
  • @mjolinor 我曾希望保持目录结构是的。然而,这篇文章中的障碍让我无法想得那么远。我想文件夹 3 不会被视为空文件夹。也许检查文件夹的大小会更好,如果它为零则认为它是空的?

标签: windows powershell powershell-2.0


【解决方案1】:

我也对此感到非常沮丧,但就像你说的 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 对象中 - %{$_.move(F:\path)}

【讨论】:

  • 使用 GetFiles() 的一个副作用是它不计算子文件夹中的文件。这可能会导致包含文件的文件夹也被复制。例如 c:\test\pstest\empty1\notempty\test.txt。如果 empty1 中没有文件,它将显示为匹配。我不确定这对韦斯利来说是否是个问题。
  • @Jon 那么一个包含文件夹但没有文件的文件夹将使用 getfiles() 返回“0”?那将是一个问题。也许我需要重新提出这个问题,因为这变得复杂了。
  • @WesleyDavid - 问一个不同的问题。这本真的是关于从一卷转移到另一卷。
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2021-11-29
  • 2021-02-24
相关资源
最近更新 更多