2013-01-11 3 views
1
을 사용하여 파일 이름에 괄호로 복사 파일을 일괄 않는 기본적으로

$ 난 할 노력하고있어입니다 : 내가 필요한 파일의 목록이 포함 된 .csv 스프레드 시트에서 정보를 당겨있어어떻게 파워 쉘

. 문제는 디렉토리에있는 디렉토리에 16,000 개 이상의 파일이 있다는 것입니다. 필자는 약 4600 개 정도만 필요합니다 (스프레드 시트 열에는 그 중 많은 수가 포함되어 있습니다). 실제로 코드의 일부분을 알아 냈습니다 ...하지만 문제가 발생하는 곳은 코드의 "Copy-Item"부분에 도달 할 때입니다. 그것은 파일 이름의 일부로 대괄호가있는 파일에 도달 할 때까지 잘 실행되므로 물론 오류를 발생시키고 필요한 정보를 제공하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까? 주의해야 할 점은 복사가 필요하거나 복사중인 파일의 이름을 변경할 수 없다는 것입니다. 그게 해결책이라면, "-LiteralPath"를 어떻게 사용할 지 모르겠습니다. :(여기 아래에있는 내 코드는 다음과 같습니다. 당신이 파일을 다시 시도 할 수있는 능력과 대량 복사를 수행 할 경우, 당신은 여전히 ​​복사 품목은 자사 -LiteralPath 매개 변수를 사용하여 사용하려는 경우

$Directory = gci D:\Documents\15075_32\ 
$Destination = "D:\CleanReview" 
$ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv' 
$BaseItem = foreach($li in $ReviewSheet){$li.Base} 
foreach($File in $Directory){ 
    $File.BaseName 
foreach($Item in $BaseItem){ 
    if($Item -like $File.BaseName){ 
     $Item 
      Copy-Item $File.FullName $Destination -Force 
} 
} 
} 

답변

0

좋아요 ... Google을 통해 많은 연구를 한 후에도 PS의 V3 및 -LiteralPath 연산자를 사용하여 수정 한 경우에도 파일 이름이 여전히 와일드 카드로 해석되었다는 것을 알 수있었습니다. 많은 시도를 통해 실수로 IF 문 내의 연산자가이 문제를 일으킨다는 사실을 발견했습니다. -LiteralPath를 사용하는 경우에도 IF 문 안에 있으며 조건이 충족되면 잊어 버릴 수 있습니다. 참된. 따라서 이것을 퇴치하기 위해 와일드 카드 해석없이 파일 이름을 읽게하려면 필자의 필자와 같은 필자를 -eq로 바꿔야 만했다. -eq는 와일드 카드를 지원하지 않기 때문이다. 내가 C 드라이브에서보고 있던대로 파일을 찾을 수 없다는보고를 한 PS가 있었지만 다음 문제는이 문제에 부딪혔다. 디렉토리를 선언 했음에도 불구하고 복사 명령 내에서 축약어로 선언문을 사용하더라도 여전히이 작업을 수행 할 수 있습니다! 추신 : 이걸로 아주 고요한 것 같아요. 결과적으로 필자가 문자 그대로 철자를 철저하게 철자로 쓰면 내가 필요한 결과를 얻을 수있을 것입니다! 그래서 검토하기 위해, 나는 csv를 가져 와서 그 컬럼이 확장자없는 파일 이름의리스트이기 때문에 하나의 컬럼을 읽는 중입니다. 이 목록을 디렉토리 목록과 비교하고 이름의 열 목록이 디렉토리의 기본 이름과 일치 할 때 ... D 드라이브의 다른 폴더에 해당 디렉토리 파일을 복사해야했습니다. 여기 내 작업 코드입니다! Keith Hill (위) 덕분에 조금씩 다르게 보았습니다! 당신의 도움을 주셔서 감사합니다!

$Directory = gci -LiteralPath D:\Documents\15075_32\ 
$Destination = "D:\CleanReview\" 
$ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv' 
$BaseItem = foreach($li in $ReviewSheet){$li.Base} 
foreach($File in $Directory){ 
foreach($Item in $BaseItem){ 
    if($Item -eq $File.BaseName){ 
     $Item 
      Copy-Item -LiteralPath D:\Documents\15075_32\$File -Destination $Destination -Force 
} 
} 
} 
1

, 내가 대신 robocopy를 사용하는 것이 좋습니다 것입니다 소스 경로.

+0

무엇을 의미합니까? 예 : $ Directory = gci -LiteralPath D : \ Documents \ 15075_32 \ –

+0

디렉토리의 경로에 -LiteralPath를 두었습니다.하지만 그 파일을 선언 할 때 차이가 어떻게 생기는지는 알 수 없습니다. 디렉토리를 나중에 별도로 작성하십시오. 또한 와일드 카드를 지원하는 곳은 어디 까지나 보았습니다. 글자 그대로 말하면 와일드 카드 오류가 발생합니다. 그래서 교환 원을 -eq로 바꿨지 만 이제 경로가 없기 때문에 .MSG 파일을 찾을 수 없다는 말을 듣고 있습니다. 그래서 $ Directory ($ Directory + $ File)에 $ Directory를 복사 - 항목 행에 추가했습니다. 그러나 파일 이름이 같더라도 지금은 복사하지 않습니다! : –

+0

이 문제를 해결하고 내가 원하는 결과를 얻을 수있었습니다. 아래에 설명 된 설명이 있습니다. –