PowerShell을 사용하여 원본 서버의 동일한 디렉터리 구조에 있는 폴더 및 하위 폴더의 복사 항목 파일
아래 스크립트가 폴더와 하위 폴더의 파일을 적절한 구조(소스 서버)로 복사하도록 하는 데 어려움을 겪고 있습니다.
아래에 언급된 폴더가 있다고 가정해 보겠습니다.
기본 폴더:파일 aaa, 파일 bbb
하위 폴더 a: 파일 1, 파일 2, 파일 3
하위 폴더 b: 파일 4, 파일 5, 파일 6
사용된 스크립트:
Get-ChildItem -Path \\Server1\Test -recurse | ForEach-Object {
Copy-Item -LiteralPath $_.FullName -Destination \\server2\test |
Get-Acl -Path $_.FullName | Set-Acl -Path "\\server2\test\$(Split-Path -Path $_.FullName -Leaf)"
}
출력: File aaa, File bbb
하위 폴더 a(비어 있는 폴더)
하위 폴더 b(비어 있는 폴더)
파일 1, 파일 2, 파일 3, 파일 4, 파일 5, 파일 6.
파일을 각 폴더(예: 원본 폴더)에 복사합니다.더 이상의 도움을 주시면 대단히 감사하겠습니다.
이 작업은 Copy-Item을 사용하여 수행할 수 있습니다.Get-Child 항목을 사용할 필요가 없습니다.저는 당신이 그것을 너무 많이 생각하고 있다고 생각합니다.
Copy-Item -Path C:\MyFolder -Destination \\Server\MyFolder -recurse -Force
방금 테스트해 봤는데 효과가 있었습니다.
편집: 댓글에 포함된 제안
# Add wildcard to source folder to ensure consistent behavior
Copy-Item -Path $sourceFolder\* -Destination $targetFolder -Recurse
원본에서 대상으로 동일한 콘텐츠를 미러링하려면 다음을 수행합니다.
function CopyFilesToFolder ($fromFolder, $toFolder) {
$childItems = Get-ChildItem $fromFolder
$childItems | ForEach-Object {
Copy-Item -Path $_.FullName -Destination $toFolder -Recurse -Force
}
}
테스트:
CopyFilesToFolder "C:\temp\q" "c:\temp\w"
한번은 내가 이 스크립트, 이 복사 폴더 및 파일을 발견하고 동일한 소스 구조를 대상에 유지하면, 당신은 이것으로 몇 번 시도할 수 있습니다.
# Find the source files
$sourceDir="X:\sourceFolder"
# Set the target file
$targetDir="Y:\Destfolder\"
Get-ChildItem $sourceDir -Include *.* -Recurse | foreach {
# Remove the original root folder
$split = $_.Fullname -split '\\'
$DestFile = $split[1..($split.Length - 1)] -join '\'
# Build the new destination file path
$DestFile = $targetDir+$DestFile
# Move-Item won't create the folder structure so we have to
# create a blank file and then overwrite it
$null = New-Item -Path $DestFile -Type File -Force
Move-Item -Path $_.FullName -Destination $DestFile -Force
}
가장 인기 있는 답변에 어려움을 겪었습니다.\Server\MyFolder\에 폴더를 배치했습니다.폴더와 나는 내 폴더에 있는 폴더와 아래의 내용을 원했습니다.이거 안 됐어요.
Copy-Item -Verbose -Path C:\MyFolder\AFolder -Destination \\Server\MyFolder -recurse -Force
또한 *.config 파일을 필터링하고 복사해야 했습니다.
이것은 재발하지 않았기 때문에 "\*"에서 작동하지 않았습니다.
Copy-Item -Verbose -Path C:\MyFolder\AFolder\* -Filter *.config -Destination \\Server\MyFolder -recurse -Force
저는 경로 문자열의 시작 부분을 잘라내어 제가 재귀하고 있는 위치에 대한 상대적인 childPath를 가져왔습니다.이는 해당 사용 사례에 적용되며 다른 솔루션에서는 적용되지 않는 많은 하위 디렉터리에 적용됩니다.
Get-Childitem -Path "$($sourcePath)/**/*.config" -Recurse |
ForEach-Object {
$childPath = "$_".substring($sourcePath.length+1)
$dest = "$($destPath)\$($childPath)" #this puts a \ between dest and child path
Copy-Item -Verbose -Path $_ -Destination $dest -Force
}
여기 있어요.
Function Backup-Files {
[CmdletBinding()]
Param (
[Parameter(Mandatory)]
[System.IO.FileInfo[]]$Source,
[Parameter(Mandatory)]
[String]$Destination
)
if (!(Test-Path $Destination)) {[void][System.IO.Directory]::CreateDirectory($Destination)}
ForEach ($File in $Source) {
$SourceRoot = $(Convert-Path $File.PSParentPath).split('\')[0]
$NewFile = $($File.FullName).Replace($SourceRoot,$Destination)
$NewDir = $($File.DirectoryName).Replace($SourceRoot,$Destination)
[void][System.IO.Directory]::CreateDirectory($NewDir)
Copy-Item -Path $File.FullName -Destination $NewFile -Force
}
}
예
<#
.SYNOPSIS
Copy FileInfo object or array to a new destination while retaining the original directory structure.
.PARAMETER Source
FileInfo object or array. (Get-Item/Get-ChildItem)
.PARAMETER Destination
Path to backup source data to.
.NOTES
Version (Date): 1.0 (2023-02-04)
Author: Joshua Biddle (thebiddler@gmail.com)
Purpose/Change: Initial script development.
Known Bugs:
.EXAMPLE
Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Documents' -Recurse -Force -Exclude 'My Music','My Pictures','My Videos','desktop.ini' -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
.EXAMPLE
Backup-Files -Source $(Get-ChildItem -Path 'C:\Users\*\Desktop' -Exclude "*.lnk","desktop.ini" -Recurse -Force -ErrorAction SilentlyContinue) -Destination "C:\Temp\UserBackup"
#>
특정 날짜와 시간이 지나면 수정된 파일을 복사할 수 있는 솔루션을 원했습니다. 즉, 필터를 통해 Get-ChildItem을 사용할 필요가 없습니다.다음은 제가 생각해 낸 것입니다.
$SourceFolder = "C:\Users\RCoode\Documents\Visual Studio 2010\Projects\MyProject"
$ArchiveFolder = "J:\Temp\Robin\Deploy\MyProject"
$ChangesStarted = New-Object System.DateTime(2013,10,16,11,0,0)
$IncludeFiles = ("*.vb","*.cs","*.aspx","*.js","*.css")
Get-ChildItem $SourceFolder -Recurse -Include $IncludeFiles | Where-Object {$_.LastWriteTime -gt $ChangesStarted} | ForEach-Object {
$PathArray = $_.FullName.Replace($SourceFolder,"").ToString().Split('\')
$Folder = $ArchiveFolder
for ($i=1; $i -lt $PathArray.length-1; $i++) {
$Folder += "\" + $PathArray[$i]
if (!(Test-Path $Folder)) {
New-Item -ItemType directory -Path $Folder
}
}
$NewPath = Join-Path $ArchiveFolder $_.FullName.Replace($SourceFolder,"")
Copy-Item $_.FullName -Destination $NewPath
}
언급URL : https://stackoverflow.com/questions/17842764/copy-item-files-in-folders-and-subfolders-in-the-same-directory-structure-of-sou
'programing' 카테고리의 다른 글
값 리스트에 대해 변수 동일성 확인 (0) | 2023.08.09 |
---|---|
Spring Boot 사용자 지정 favicon.ico가 표시되지 않음 (0) | 2023.08.09 |
Oracle의 단순 재귀 쿼리 (0) | 2023.08.09 |
Spring Boot JPA H2 콘솔이 실행되고 있지 않습니다. application.properties 파일이 무시됩니다. (0) | 2023.08.09 |
모든 Python 클래스가 개체를 확장해야 합니까? (0) | 2023.08.09 |