2013-10-14 2 views
0

파일을 한 위치에서 다른 위치로 복사하려고하는데 파일이 원본과 같은 폴더에 있어야합니다. 다음 스크립트를 사용하면 파일을 복사하지만 원본 폴더의 폴더는 복사하지 않습니다. 어떤 제안?Powershell 폴더 계층 구조를 유지하면서 폴더와 파일 복사

$a=Get-ChildItem C:\temp\_pdf_list -recurse | Where-Object {$_.name -like "*pdf" -and $_.name -notlike "*prth*"} 

$a 

foreach($x in $a) {copy-item -path $x.FullName "c:\temp\_pdfs_ck" -whatif} 

대상 경로가 파일을 원하는 방식으로 1001이라는 하위 폴더에 배치하지 않습니다.

출력 :

What if: Performing operation "Copy File" on Target "Item: C:\temp\_pdf_list\1001\10010001.pdf Destination: C:\temp\_pdfs_ck\10010001.pdf". 

답변

0

가 이상적으로 하나가 robocopy 같은 도구를 사용하는 것입니다,하지만 난 (/xf pattern) (소스 및 대상 폴더 후 매개 변수를 추가) 포괄적이고 독점적 모두 해본 적이 한에서 이름이 일치하는 파일 같은 시간.

PowerShell에서 이렇게하려면 완전한 출력 경로를 만들어야합니다. 대상 폴더가 copy-item으로 제공되면 원본 파일 이름은 제공되지만 상대 경로는 제공되지 않습니다.

그래서, 뭔가 같은 :

$dest = $x.FullName.Replace('C:\temp\_pdf_list', 'c:\temp\_pdfs_ck') 
copy-item -path $x.FullName -Destination $dest 

참고 :

  1. 나는 그 정규식을 소요하기 때문에 -replace 연산자를 사용하고, 일반 파일 이름 문자 아니에요 (같은 \ 정규 표현식에에 중요하다

  2. 이 모든 것을 단일 파이프 라인에서 수행하지 않는 이유는 무엇입니까?

    Get-ChildItem … | Where-Object … | Foreach-Object { $dest = …; Copy-Item … } 
    

    이렇게하면 다음 문장에서 인 중간 컬렉션에 대해 잠재적으로 큰 배열을 만들지 않으십니까?

+0

의견을 보내 주셔서 감사합니다. 내가 robocopy를 사용하지 않은 이유는 그것을 내 컴퓨터에 설치할 수 없다는 것입니다. 나는 한 파이프 라인에 대한 당신의 의견에 흥미가 있습니다. Powershell을 처음 접했을 때 나의 예제를 기반으로 전체 코드를 제공 할 수 있습니까? – user1476427

+0

Robocopy는 Vista/Windows Server 2008부터 표준으로 사용되었습니다. PowerShell 3.0을 사용하는 경우 Windows 7 또는 Server 2008R2 이상을 실행하고 있습니다. 즉, 설치해야 할 것은 없습니다. 이미 설치되어 있어야합니다. – alroc

+0

@ user1476427 : 타원 ('... ')을 코드에서와 동일한 매개 변수로 바꿉니다. – Richard

관련 문제