2017-03-06 4 views
0

현재 파일 이름이 인 과 일치하는 파일을 검색하고 csv 파일을 기반으로 다양한 파일 공유 위치에 파일을 복사합니다. CSV 파일에는 복사 할 대상 열 = 경로와 복사 할 파일을 식별하기위한 문자열 찾기 = 등 2 개의 필드가 있어야합니다.파일을 CSV에서 여러 위치로 복사

내 CSV 파일은 다음과 같다 : 현재

"matching file names"  , "Destination" 
"Don" ,  "c:\test\a" 
"Quest"  , "c:\test\b"

모든 위치에 복사합니다 모든 파일을.

스크립트 : 귀하의 CSV에는 열 "찾기"없다

$csv = Import-Csv -Path "C:\Temp\list.csv" 
$filepath = 'C:\Temp\Source' 

Get-ChildItem $filepath | foreach { 
    $criteria = $csv 
    $find = $csv | select -ExpandProperty find 

    $a = $_.FullName 
    foreach ($f in $find) { 
    if ($a -like "*$f*") { 
     foreach ($c in $criteria) { 
     Copy-Item $_.FullName $c.Destination 
     } 
    } 
    } 
} 

답변

0

우선. "파일 이름 일치"라는 제목의 컬럼에는 실제로 "찾기"라는 제목이 있다고 가정합니다.

문제는 코드에서 중첩 된 이중 루프로 인해 발생합니다. 각 패턴을 반복 한 다음 주어진 패턴과 일치하는 모든 파일을 가장 안쪽 루프가있는 CSV의 모든 대상에 복사합니다.

CSV 데이터에 대해 하나의 루프 만 사용하면 (필터 문자열과 대상 경로 간의 연결을 유지하기 위해) 문제가 사라집니다. 또한 -like 연산자 대신 Contains() 메서드를 사용하는 것이 좋으므로 필터 문자열에 와일드 카드를 추가 할 필요가 없습니다.

Get-ChildItem $filepath | ForEach-Object { 
    foreach ($filter in $csv) { 
    if ($f.Name.Contains($filter.find)) { 
     Copy-Item $_.FullName $filter.Destination 
    } 
    } 
} 
+0

감사합니다. – kbs

관련 문제