在Copy-Item cmdlet中为详细选项定义文件夹深度

时间:2015-02-04 20:03:48

标签: powershell

我使用以下命令将目录树从一个文件夹复制到另一个文件夹。

Copy-Item $SOURCE $DEST -Filter {PSIsContainer} -Recurse -Force -Verbose

详细选项正确显示复制的每个文件夹。但是,我想告诉Verbose选项只显示复制的子文件夹的第一级。因此子文件夹/子文件夹/ ...等不会出现。

有可能吗?

3 个答案:

答案 0 :(得分:2)

您可以使用-Verbose选项通过管道处理成功处理的项目,而不是使用-PassThru选项。在以下示例中,我假设$DEST现有目录,其中将出现新复制的目录。 (你不能在不存在的对象上调用Get-Item。)

$SOURCE = Get-Item "foo"
$DEST   = Get-Item "bar"

Copy-Item $SOURCE $DEST -Filter {PSIsContainer} -Recurse -Force -PassThru | Where-Object {

  # Get the parent object.  The required member is different between
  # files and directories, which makes this a bit more complex than it
  # might have been.

  if ($_.GetType().Name -eq "DirectoryInfo") {
    $directory = $_.Parent
  } else {
    $directory = $_.Directory
  }

  # Select objects as required, in this case only allow through
  # objects where the second level parent is the pre-existing target
  # directory.

  $directory.Parent.FullName -eq $DEST.FullName
}

答案 1 :(得分:1)

计算路径中的反斜杠数,并添加逻辑以仅选择第一级。这样的事可能呢?

$Dirs=get-childitem $Source -Recurse | ?{$_.PSIsContainer}
Foreach ($Dir in $Dirs){
    $Level=([regex]::Match($Dir.FullName,"'b")).count
    if ($Level -eq 1){Copy-Item $Dir $DEST -Force -Verbose}
    else{Copy-Item $Dir $DEST -Force}}

*编辑为包含每个要求的循环和逻辑

答案 2 :(得分:0)

我建议使用robocopy代替copy-item。它的/LEV:n开关听起来就像是你正在寻找的。示例(您需要测试和调整以满足您的要求):

robocopy $source $dest /LEV:2

robocopy有大约7亿个选项可供指定,以便从中获得一些非常有用和有趣的行为。