Copy-Item不包括PowerShell

时间:2017-04-13 12:20:29

标签: powershell copy-item file-move

我有一个脚本,它将具有特定扩展名的文件从源目录移动到目标目录。

我的源目录如下:

FILESFOLDER

  • File1.td

  • File2.td

    SUBFOLDER

    • File3.td

    • File4.td

我的脚本很短,看起来像:

if(!(Test-Path $SourceDirPath) -or !(Test-Path $DestinationDirPath))
{
    Write-Host "The source- or destination path is incorrect, please check "
    break
}else
{
    Write-Host "Success"
    Copy-Item -path $SourceDirPath -Filter "*$extension" -Destination $DestinationDirPath -Recurse
}

我必须提及 $SourceDirPath来自配置文件,只有在我声明为C:\FILESFOLDER\*时才有效

该脚本有效,但不会将文件从子文件夹复制到目标。目的地只有File1和File2。

我的Copy-Item命令出了什么问题?

4 个答案:

答案 0 :(得分:3)

-Recurse开关对您的案例无效,因为它仅适用于$SourceDirPath组合所匹配的项目,后者使用尾随\* }匹配源目录中 的项目,以及-Filter,在您的情况下,只是源目录中直接*.td个文件

省略尾随\* 以定位目录本身(例如,C:\FOLDER而不是C:\FOLDER\*),原则上解决了问题,但是,due to an annoying quirk 只有在目标目录的情况下才能正常工作。 如果它存在,则项目将放置在目标目录的子目录中,并以目录命名。

如果在复制之前现有目标目录中没有任何内容可以保留(并且目录本身的特殊属性不需要保留,则可以通过删除预先存在的目标目录

if(!(Test-Path $SourceDirPath) -or !(Test-Path $DestinationDirPath))
{
    Write-Host "The source or destination path is incorrect, please check "
    break
}
else
{
    Write-Host "Success"

    # Delete the preexisting destination directory,
    # which is required for the Copy-Item command to work as intended.
    # BE SURE THAT IT IS OK TO DO THIS.
    Remove-Item $DestinationDirPath -Recurse

    # Note: $SourceDirPath must NOT end in \*  
    Copy-Item -Recurse -LiteralPath $SourceDirPath -Filter "*$extension" -Destination $DestinationDirPath
}

如果您确实需要保留现有的$DestinationDirPath内容或属性(ACL,...),则需要做更多的工作。

答案 1 :(得分:1)

您应该将Get-ChildItem cmdlet与-recurse参数一起使用,以根据您的过滤条件检索所有文件。然后,您可以将结果通过管道传输到Copy-Item cmdlet,只需指定目标。

答案 2 :(得分:1)

因此,这将比较目录源与目标,然后复制内容。忽略我的时髦变量,我已经在编辑

下修改了它们
 #Release folder
    $Source =  ""
    #Local folder
    $Destination = ""

    #Find all the objects in the release
    get-childitem $Source -Recurse | foreach {

    $SrcFile = $_.FullName
    $SrcHash = Get-FileHash -Path $SrcFile -Algorithm MD5 # Obtain hash

    $DestFile = $_.Fullname -replace [RegEx]::escape($Source),$Destination #Escape the hash
    Write-Host "comparing $SrcFile to $DestFile" -ForegroundColor Yellow

    if (Test-Path $DestFile) 
    {
    #Check the hash sum of the file copied
    $DestHash = Get-FileHash -Path $DestFile -Algorithm MD5

    #compare them up
    if ($SrcHash.hash -ne $DestHash.hash) {
        Write-Warning "$SrcFile and $DestFile Files don't match!"

        Write-Warning "Copying $SrcFile to $DestFile " 

        Copy-Item $SrcFile -Destination $DestFile -Force
    } 
    else {
        Write-Host "$SrcFile and $DestFile Files Match" -ForegroundColor 
Green

    }
        } 
    else {
        Write-host "$SrcFile is missing! Copying in" -ForegroundColor Red
        Copy-Item $SrcFile -Destination $DestFile -Force

         }
    }  

答案 3 :(得分:1)

试试这个:

$source =  "C:\Folder1"

$destination = "C:\Folder2"

$allfiles = Get-ChildItem -Path $source -Recurse -Filter "*$extension"
foreach ($file in $allfiles){
    if (test-path ($file.FullName.replace($source,$destination))) {
    Write-Output "Seccess"
    Copy-Item -path $file.FullName -Destination ($file.FullName.replace($source,$destination))
    }
    else {
    Write-Output "The source- or destination path is incorrect, please check "
    break
    }
}