Только Powershell копирует подходящие файлы из каталога - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу скопировать файлы из одной Sourcediretcory в targetDirectory на основе referenceDirectory.

SourceDirectory содержит все файлы. Я хочу только подмножество этих файлов (обратите внимание, что некоторые из них находятся в подкаталогах).

Я хочу скопировать некоторые из этих файлов из C: \ SourceDirectory \ в C: \ TargetDirectory, но я только хочу скопировать файлы, которые появляются в моем C: \ ReferenceDirectory.

Я не уверен, как мне это сделать в Powershell, потому что у меня будут отдельные префиксы каталогов.

Я уже нашел некоторый код, но я не думаю, что он работает для разных имен каталогов. Было бы здорово, если бы не нужно было создавать список целевых файлов в качестве промежуточного шага.

step1 CMD dir * /s/b > ReferenceFiles.txt

step2 POWERSHELL cat ReferenceFiles.txt | ForEach {cp $_ <destination TargetDirectory>}

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Если я правильно понял вопрос, вы хотите скопировать только файлы из исходного каталога, если в справочном каталоге есть соответствующий файл.

Для этого должно работать:

$sourceDir      = 'C:\SourceDirectory'
$destinationDir = 'C:\TargetDirectory'
$referenceDir   = 'C:\ReferenceDirectory'

# create the destination directory if it does not exist, otherwise
# create an array of files already contained in that directory
# in order to prevent overwriting them
if (!(Test-Path -Path $destinationDir -PathType Container)) {
    $null = New-Item -Path $destinationDir -ItemType Directory
    $destFiles = @()
}
else {
    $destFiles = Get-ChildItem -Path $destinationDir -File | Select-Object -ExpandProperty Name -Unique
}

# get a list of file names that are present in C:\ReferenceDirectory
$refFiles = Get-ChildItem -Path $referenceDir -File -Recurse | Select-Object -ExpandProperty Name -Unique

# next, go through the files in the source directory and copy the files that are listed
# in array $refFiles, but NOT in array $destFiles to the target directory
Get-ChildItem -Path $sourceDir -File -Recurse | 
    Where-Object { $refFiles -contains $_.Name -and $destFiles -notcontains $_.Name } | 
    Copy-Item -Destination $destinationDir
0 голосов
/ 04 февраля 2020

Вы действительно не предоставляете всю необходимую информацию, чтобы дать вам окончательный ответ.

Как, что это значит ...

, потому что у меня будет отдельный префикс каталога .

... поскольку вы этого не показываете.

Вы специально просите отличий от Reference против Source, таким образом, у вас должен быть шаг для этого. Вы можете сделать это вне al oop.

Для простого случая ...

Clear-Host
# Show all files from the copy source
($fsoSource = Get-ChildItem -Recurse -path 'D:\temp\Source')

# Results
<#
    Directory: D:\temp\Source


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        29-Dec-19     21:50             69 5 Free Software You'll Wish You Knew Earlier! 2019 - YouTube.url
-a----        10-Jan-20     17:59              0 awél.txt
-a----        25-Jan-20     15:43            176 book1.csv
-a----        01-Feb-20     00:22             66 FileList.txt
-a----        04-Jan-20     02:01             39 hello.bat
-a----        04-Jan-20     01:43             44 hello.ps1
-a----        04-Jan-20     02:16             64 mytest - Copy.txt
-a----        04-Jan-20     02:16             64 mytest.txt
-a----        19-Jan-20     14:49            230 mytest.zip
-a----        01-Jan-20    ...
#>

# Show files to copy from reference target
($fsoReference = Get-ChildItem -Recurse -path 'D:\temp\Reference' -Recurse)

# Results
<#
    Directory: D:\temp\Reference


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        10-Jan-20     17:59              0 awél.txt
-a----        04-Jan-20     02:01             39 hello.bat
-a----        04-Jan-20     01:43             44 hello.ps1
-a----        04-Jan-20     02:16             64 mytest - Copy.txt
-a----        04-Jan-20     02:16             64 mytest.txt
#>

$fsoSource | 
ForEach{
    If ($PSItem.Name -in $fsoReference.Name)
    {Copy-Item -Path $PSItem.FullName -Destination 'D:\Temp\Target' -WhatIf} 
}

# Results
<#
What if: Performing the operation "Copy File" on target "Item: D:\temp\Source\awél.txt Destination: D:\Temp\Target\awél.txt".
What if: Performing the operation "Copy File" on target "Item: D:\temp\Source\hello.bat Destination: D:\Temp\Target\hello.bat".
What if: Performing the operation "Copy File" on target "Item: D:\temp\Source\hello.ps1 Destination: D:\Temp\Target\hello.ps1".
What if: Performing the operation "Copy File" on target "Item: D:\temp\Source\mytest - Copy.txt Destination: D:\Temp\Target\mytest - Copy.txt".
What if: Performing the operation "Copy File" on target "Item: D:\temp\Source\mytest.txt Destination: D:\Temp\Target\mytest.txt".
#>

Если у вас есть определенные c каталоги, то вы должны указать их в натуральном выражении .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...