在 2 个文件位置检查文件的功能不起作用

问题描述

我正在尝试创建一个程序,该程序将使用 Powershell 将文件从我们的备份复制到存档目录。为了让这个程序顺利运行,我有两个标准。一个是我们有当年和过去年份的文件,所以只有今年的文件必须复制。另一个是我们必须检查以确保我们没有复制相同文件名的文件,以防万一文件中的数据被意外修改。每当我在函数中没有这个程序时,它就可以工作。但是在一个函数中,它给了我错误,即它“找不到我正在复制的文件夹的路径”以及我将文件粘贴到的文件夹。我将在 60 多个位置使用它,因此最好不必将函数中的代码重写 60 次。我考虑过使用 Robocopy,但不管文件没有被复制,我仍然遇到同样的问题。

Function copy-Data {

param (
    [system.object]$copyFolder,[system.object]$pasteFolder,[int]$currentYear,[int]$lastYear,[int]$nextYear)

    $copyItem = Get-ChildItem -Path $copyFolder
    $pasteItem = Get-ChildItem -Path $pasteFolder

    $copyCount = $copyItem.count

    for ($i = 0; $i -lt $copyCount; $i++)
    {
        $copyName = $copyItem.Name
        $testPath = Test-Path "$pasteFolder$copyName"

        if ($copyItem[$i].LastWriteTime -gt $firstDate -and $copyItem[$i].LastWriteTime -lt $lastDate)
        {
            if ($testPath -eq $false)
            {
                copy-Item -Path $copyFolder$copyName -Destination $pasteFolder
                #Robocopy "$copyFolder$copyItem[$i]" "$pasteFolder"
                Write-Host $pasteFolder$copyName
            }
        }
    }
}

$currentYear = Get-Date -Format "yyyy"
$lastYear = [int]$currentYear - 1
$nextYear = [int]$currentYear + 1
$firstDate = "12/31/$lastYear"
$lastDate = "01/01/$nextYear"

$copyFolder = "\\fileshare\test\copy\"
$pasteFolder = "\\fileshare\test\$currentYear\paste\"
copy-Data ($copyFolder,$pasteFolder,$currentYear,$lastYear,$nextYear)

解决方法

我觉得你让这件事变得比实际需要的更复杂。

核心代码可以是这样的:

Get-ChildItem -Path $copyFolder |
ForEach-Object{
    If( !(Test-Path $pasteFolder -Name $_.Name ) )
    {
        Copy-Item $_.FullName -Destination $pasteFolder
    }
}

您可以只使用目标路径,而不必提供目标文件的完整路径。

作为一个函数,它可能看起来像:

Function CopyFoldercontents
{
    Param(
        [Parameter( Mandatory = $true,Position = 0)]
        [String]$copyFolder,[Parameter( Mandatory = $true,Position = 1)]
        [String]$pasteFolder
        ) # End Parameter Block.

    Get-ChildItem -Path $copyFolder |
    ForEach-Object{
        If( !(Test-Path $pasteFolder -Name $_.Name ) )
        {
            Copy-Item $_.FullName -Destination $pasteFolder
        }
    }
} # End Function CopyFolderContents

不过,这可能会更健壮,这取决于您想朝哪个方向发展。

,

继续我的评论。 你可以这样做... (验证双方所追求的,构造最终函数)

Function Start-FolderMirror
{
    [CmdletBinding()]
    [Alias('mir')]
    Param
    (
        [string]$SourcePath      = (Read-Host -Prompt 'Enter a source path'),[string]$DestinationPath = (Read-Host -Prompt 'Enter a destination path')
    )

    $SourceFiles      = (Get-ChildItem -Path $SourcePath -File).FullName
    $DestinationFiles = (Get-ChildItem -Path $DestinationPath -File).FullName

    Compare-Object -ReferenceObject $SourceFiles -DifferenceObject $DestinationFiles -IncludeEqual | 
    Select-Object -First 5
}

Start-FolderMirror -SourcePath 'd:\temp' -DestinationPath 'D:\temp\TestFiles'
# Results
<#
InputObject                                                 SideIndicator
-----------                                                 -------------
D:\temp\TestFiles\abc - Copy - Copy.bat                     =>           
D:\temp\TestFiles\abc - Copy.bat                            =>           
D:\temp\TestFiles\abc.bat                                   =>           
D:\temp\(MSINFO32) command-line tool switches.pdf           <=           
D:\temp\23694d1213305764-revision-number-in-excel-book1.xls <=  
#>

Function Start-FolderMirror
{
    [CmdletBinding(SupportsShouldProcess)]
    [Alias('mir')]
    Param
    (
        [string]$SourcePath      = (Read-Host -Prompt 'Enter a source path'),[string]$DestinationPath = (Read-Host -Prompt 'Enter a destination path')
    )

    $SourceFiles      = (Get-ChildItem -Path $SourcePath -File).FullName
    $DestinationFiles = (Get-ChildItem -Path $DestinationPath -File).FullName

    Compare-Object -ReferenceObject $SourceFiles -DifferenceObject $DestinationFiles -IncludeEqual | 
    Select-Object -First 5 | 
    Where-Object -Property SideIndicator -Match '<='
}

Start-FolderMirror -SourcePath 'd:\temp' -DestinationPath 'D:\temp\TestFiles' -WhatIf
# Results
<#
InputObject                                                 SideIndicator
-----------                                                 -------------
D:\temp\(MSINFO32) command-line tool switches.pdf           <=           
D:\temp\23694d1213305764-revision-number-in-excel-book1.xls <=  
#>


Function Start-FolderMirror
{
    [CmdletBinding(SupportsShouldProcess)]
    [Alias('mir')]
    Param
    (
        [string]$SourcePath      = (Read-Host -Prompt 'Enter a source path'),[string]$DestinationPath = (Read-Host -Prompt 'Enter a destination path')
    )

    $SourceFiles      = (Get-ChildItem -Path $SourcePath -File).FullName
    $DestinationFiles = (Get-ChildItem -Path $DestinationPath -File).FullName

    Compare-Object -ReferenceObject $SourceFiles -DifferenceObject $DestinationFiles -IncludeEqual | 
    Select-Object -First 5 | 
    Where-Object -Property SideIndicator -Match '<=' | 
    ForEach {Copy-Item -Path $PSItem.InputObject -Destination $DestinationPath}
}

Start-FolderMirror -SourcePath 'd:\temp' -DestinationPath 'D:\temp\TestFiles' -WhatIf
# Results
<#
What if: Performing the operation "Copy File" on target "Item: D:\temp\(MSINFO32) command-line tool switches.pdf Destination: D:\temp\TestFiles\(MSINFO32) command-line tool switches.pdf".
What if: Performing the operation "Copy File" on target "Item: D:\temp\23694d1213305764-revision-number-in-excel-book1.xls Destination: D:\temp\TestFiles\23694d1213305764-revision-number-in-excel-book1.xls".
#>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...