가능하면 모든 Powershell 명령을 사용하는 것이 좋습니다. 약간의 테스트를 거친 후에는 이것이 최선의 방법입니다.
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter}
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}
처음 세 줄은 쉽게 읽을 수 있도록하기 위해 원하는 경우 실제 명령 내에서 변수를 정의 할 수 있습니다. 이 코드 샘플의 핵심은 정규식 일치를 허용하는 필터 인 "Where-Object"명령입니다. 정규 표현식 지원은 약간 이상합니다. 나는 PDF 참조 카드를 발견 여기 왼쪽에 지원되는 문자가 있습니다.
[편집하다]
"@Johannes Rössel"에서 언급했듯이 마지막 두 줄을 한 줄로 줄일 수도 있습니다.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
주요 차이점은 Johannes의 방식은 객체 필터링을 수행하고 내 방식은 텍스트 필터링을 수행한다는 것입니다. Powershell로 작업 할 때는 거의 항상 개체를 사용하는 것이 좋습니다.
[편집 2]
@smoknheap에서 언급했듯이 위의 스크립트는 폴더 구조를 평평하게 만들고 모든 파일을 하나의 폴더에 넣습니다. 폴더 구조를 유지하는 스위치가 있는지 확실하지 않습니다. -Recurse 스위치를 시도했지만 도움이되지 않습니다. 내가 이것을 작동시키는 유일한 방법은 문자열 조작으로 돌아가서 폴더를 필터에 추가하는 것입니다.
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
더 우아한 방법이 있다고 확신하지만 테스트에서 작동합니다. 그것은 모든 것을 모은 다음 이름 일치와 폴더 객체 모두를 필터링합니다. 문자열 조작에 액세스하려면 ToString () 메서드를 사용해야했습니다.
[편집 3]
이제 경로를보고하여 모든 것이 올바른지 확인하십시오. "Write-Host"명령을 사용할 수 있습니다. 다음은 진행 상황에 대한 힌트를 제공하는 코드입니다.
cls
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
관련 문자열을 반환해야합니다. 어딘가에 아무것도 없으면 문제가있는 항목을 알 수 있습니다.
도움이 되었기를 바랍니다