如何根据上次修改日期将文件复制到网络驱动器?

时间:2019-08-16 14:06:50

标签: powershell

我们的Git存储库崩溃了,我们最终丢失了该存储库,所以现在我们所有的用户代码都只在本地工作站上。对于临时存储,我们将让它们全部都将其本地存储库放在网络共享上。我目前正在尝试编写PowerShell脚本,以允许用户使用GridView选择所有存储库,然后将它们复制到网络共享。这将导致很多重叠,因此当它们是重复文件时,我只希望将具有最新修改日期(提交)的文件覆盖。

例如,

用户1的repo \ file.txt最近修改为8/10,并将其上传到网络共享。

用户2的repo \ file.txt上次修改时间为8/12。当用户2复制到共享时,它应该覆盖用户1文件,因为它是较新的文件。

我是PowerShell的新手,所以我不确定该朝哪个方向走。 截至目前,我已经弄清楚了如何复制所有文件,但无法弄清楚最后修改的部分。任何帮助将不胜感激。

$destination = '\\remote\IT\server'

$filesToMove = get-childitem -Recurse | Out-GridView -OutputMode Multiple
$filesToMove | % { copy-item $_.FullName $destination -Recurse }

2 个答案:

答案 0 :(得分:0)

这是我在这里的第一篇文章,因此请原谅。我正在浏览reddit / stackoverflow,以寻找案例来练习我的PowerShell技能。我尝试在本地家用PC上按照您的要求创建一个脚本,让我知道这是否对您有帮助:

$selectedFiles = get-childitem -Path "C:\Users\steven\Desktop" -Recurse | Out-GridView -OutputMode Multiple
$destPath = "D:\"
foreach ($selectedFile in $selectedFiles) {
    $destFileCheck = $destPath + $selectedFile
    if (Test-Path -Path $destFileCheck) {
        $destFileCheck = Get-ChildItem -Path $destFileCheck
        if ((Get-Date $selectedFile.LastWriteTime) -gt (Get-Date $destFileCheck.LastWriteTime)) {
            Copy-Item -Path $selectedFile.FullName -Destination $destFileCheck.FullName
        }
        else {
            Write-Host "Source file is older than destination file, skipping copy."
        }
    }
}

答案 1 :(得分:0)

如果您的用户有权在远程目标路径中写入/删除文件,则应该这样做:

$destination = '\\remote\IT\server\folder'

# create the destination folder if it does not already exist
if (!(Test-Path -Path $destination -PathType Container)) {
    Write-Verbose "Creating folder '$destination'"
    New-Item -Path $destination -ItemType Directory | Out-Null
}

Get-ChildItem -Path 'D:\test' -File -Recurse |
    Out-GridView -OutputMode Multiple -Title 'Select one or more files to copy' | ForEach-Object {
        # since we're piping the results of the Get-ChildItem into the GridView, 
        # every '$_' is a FileInfo object you can pipe through to the Copy-Item cmdlet.

        $skipFile = $false
        # create the filename for a possible duplicate in the destination
        $dupeFile = Join-Path -Path $destination -ChildPath $_.Name
        if (Test-Path -Path $dupeFile) {
            # if a file already exists AND is newer than the selected file, do not copy
            if ((Get-Item -Path $dupeFile).LastWriteTime -gt $_.LastWriteTime ) {
                Write-Host "Destination file '$dupeFile' is newer. Skipping."
                $skipFile = $true
            }
        }
        if (!$skipFile) {
            $_ | Copy-Item -Destination $destination -Force
        }
  }