Я не хочу копировать всю папку, как мне сказать ей не копировать определенные папки, например ( appData и application Data )
csv-файл содержит:
FullName Name
\\computer6587\c$\Users\A2846 A2846
\\computer6587\c$\Users\B2846 B2846
Код:
Import-Csv -path C:\computer6587-PREP.csv | foreach {Copy-item -recurse $_.FullName "c:\backup" -Force -Verbose}
csv содержит: Полное имя Имя \computer6587\c$\Users\A2846 A2846 \computer6587\c$\Users\B2846 B2846
если не сложно, не могли бы вы помочь мне и с этим тоже stackoverflow.com/questions/65346076/…
Для этого я сделал вспомогательную функцию некоторое время назад:
function Copy-ExcludeFolders {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
[ValidateScript({ $_ | Test-Path -PathType Container })]
[string]$SourceFolder,
[Parameter(Mandatory = $true, Position = 1)]
[string]$Destination,
[Parameter(Mandatory = $true, Position = 2)]
[string[]]$Exclude,
[switch]$Force
)
# create a regex of the folders to exclude
# each folder will be Regex Escaped and joined together with the OR symbol '|'
$notThese = ($Exclude | ForEach-Object { [Regex]::Escape($_) }) -join '|'
Get-ChildItem -Path $SourceFolder -Recurse -File |
Where-Object{ $_.DirectoryName -notmatch $notThese } |
ForEach-Object {
$target = Join-Path -Path $Destination -ChildPath $_.DirectoryName.Substring($SourceFolder.Length)
if (!(Test-Path -Path $target -PathType Container)) {
Write-Verbose "Creating folder '$target'"
$null = New-Item -Path $target -ItemType Directory
}
Write-Verbose "Copying '$($_.FullName)' to '$target'"
$_ | Copy-Item -Destination $target -Force:$Force
}
}
Разместив эту функцию в верхней части скрипта, используйте ее следующим образом:
$exclude = 'appData', 'application Data' # add more folders to exclude here
Import-Csv -Path 'C:\computer6587-PREP.csv' | ForEach-Object {
Copy-ExcludeFolders -SourceFolder $_.FullName -Destination 'C:\backup' -Exclude $exclude -Force -Verbose
}
Если вы хотите, чтобы данные пользователей были скопированы в определенную подпапку в пути назначения, я предлагаю вам также использовать столбец Name
, который у вас есть в csv.
$exclude = 'appData', 'application Data' # add more folders to exclude here
Import-Csv -Path 'C:\computer6587-PREP.csv' | ForEach-Object {
$dest = Join-Path -Path $destination -ChildPath $_.Name
# just to see if the input from the csv will give you the desired source and destination paths:
Write-Host "Copying files from '$($_.FullName)' to folder '$dest'"
Copy-ExcludeFolders -SourceFolder $_.FullName -Destination $dest -Exclude $exclude -Force -Verbose
}
РЕДАКТИРОВАТЬ
Мы не должны добавлять так много комментариев к вопросу. Вот как я протестировал приведенный выше код, и результат показывает, что он точно такой, как ожидалось.
Я использовал это для ввода csv под названием Source-PREP.csv
(ваше имя файла, конечно, будет другим)
FullName,Name,LastWriteTime
D:\Test\Users\H107371a,H107371a,11/25/2020 7:19
D:\Test\Users\m763671,m763671,12/3/2020 9:12
D:\Test\Users\W575288,W575288,9/18/2020 15:23
D:\Test\Users\W575288a,W575288a,9/18/2020 15:23
Затем я создал несколько фиктивных пользователей в своем пути D:\Test с папками appData и application Data, а также некоторыми подпапками, которые следует скопировать:
D:\TEST\USERS
+---H107371a
| | test.txt
| |
| +---appData
| | mustnotcopy.txt
| |
| +---application Data
| | donotcopy.txt
| |
| +---Folder1
| | blah.txt
| | somepicture.jpg
| |
| \---Folder2
| myvideo.mp4
| whatever.txt
|
+---m763671
| | test.txt
| |
| +---appData
| | mustnotcopy.txt
| |
| +---application Data
| | donotcopy.txt
| |
| +---FolderA
| | blah1.txt
| | somepicture1.jpg
| |
| \---FolderB
| myvideo1.mp4
| whatever1.txt
|
+---W575288
| | test.txt
| |
| +---appData
| | mustnotcopy.txt
| |
| +---application Data
| | donotcopy.txt
| |
| +---FolderX
| | blah2.txt
| | somepicture2.jpg
| |
| \---FolderY
| myvideo2.mp4
| whatever2.txt
|
\---W575288a
| test.txt
|
+---Another-Folder
| myvideo3.mp4
| whatever3.txt
|
+---appData
| mustnotcopy.txt
|
+---application Data
| donotcopy.txt
|
\---Some-Folder
blah3.txt
somepicture3.jpg
Далее я запустил код
$exclude = 'appData', 'application Data' # add more folders to exclude here
$destination = "\\<myMachine>\D$\CopiedProfiles"
Import-Csv -Path 'D:\Source-PREP.csv' | ForEach-Object {
$dest = Join-Path -Path $destination -ChildPath $_.Name
# just to see if the input from the csv will give you the desired source and destination paths:
Write-Host "Copying files from '$($_.FullName)' to folder '$dest'"
Copy-ExcludeFolders -SourceFolder $_.FullName -Destination $dest -Exclude $exclude -Force -Verbose
}
и это результат после копирования:
D:\COPIEDPROFILES
+---H107371a
| | test.txt
| |
| +---Folder1
| | blah.txt
| | somepicture.jpg
| |
| \---Folder2
| myvideo.mp4
| whatever.txt
|
+---m763671
| | test.txt
| |
| +---FolderA
| | blah1.txt
| | somepicture1.jpg
| |
| \---FolderB
| myvideo1.mp4
| whatever1.txt
|
+---W575288
| | test.txt
| |
| +---FolderX
| | blah2.txt
| | somepicture2.jpg
| |
| \---FolderY
| myvideo2.mp4
| whatever2.txt
|
\---W575288a
| test.txt
|
+---Another-Folder
| myvideo3.mp4
| whatever3.txt
|
\---Some-Folder
blah3.txt
somepicture3.jpg
Если у вас другие результаты, исправьте входной файл csv, чтобы файл имел правильную исходную папку в столбце FullName
и правильное имя подпапки назначения для создания целевой папки в параметре Destination
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат.
Пожалуйста, сформулируйте свой вопрос правильно. Каково содержание вашего CSV-файла? Если вы не хотите копировать определенные папки, исключите их из списка копируемых объектов.