PowerShell - 같은 이름의 두 개의 파일이 있는지 확인하십시오.
-
21-12-2019 - |
문제
일련의 디렉토리와 하위 디렉토리를 확인하여 동일한 폴더에 동일한 이름이있는 두 개 이상의 파일이 있는지 확인하려고합니다.나는 내 문제가 문자열을 검증하려고하는 방법이라고 생각합니다.
다음 테스트 디렉토리의 경우 :
- | - C : \ test \
- --c : \ test \ yy \
- --c : \ test \ yy \ xx.log
- --c : \ test \ yy \ xx.txt
- --c : \ test \ yy \
- | - C : \ test \ zz \
- - c : \ test \ zz.log
- - c : \ test \ zz.txt
xx.log 및 zz.log를 찾는 코드가 필요합니다.$_.PSisContainer
에 대한 수표를 포함 할 수 있습니다 (그러나 나는 그것이 필요하다고 생각하지 않았습니다).
ForEach ($item in (gci "C:\Test\*" -recurse)) {
If ($item.extension -notmatch "txt" -AND $item.basename+".txt" -eq $True) {
Write-Host $item.fullname
}
}
.
$item.basename+".txt"
는 올바른 문자열을 제공하지만 해당 문자열을 사용하여 파일의 존재를 확인할 수 없습니다.
누구나 내 코드를 수정하는 데 도움이 될 수 있습니까?이와 같은 연결된 문자열을 처리하는 방법을 배우고 싶습니다. 다른 분야에서 유용 할 것으로 생각하는 트릭입니다.
해결책
답변이 아니라 댓글이 아니라 코멘트를 지금 추가 할 수 없게됩니다. (
r_c_iii - 원래 코드에 두 가지 오류가 있습니다.
첫째, 완전한 파일 경로 (즉, directoryName + basename + .txt)를 빌드하지 않습니다. 이를 위해 문자열을 연결하기보다는 Keith는 PowerShell의 이중 인용 문자열 내부의 가치 대체를 수행하는 능력을 사용했습니다. 예를 들어.
$s = "there"
write-host "hello $s"
.
는
를 생성합니다hello there
.
이 방식으로 객체 속성을 문자열에 삽입하려면 키스 설명으로 하위 표현식을 사용해야합니다.
$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"
.
는
를 생성합니다c:\somefile.NEW
.
두 번째로 (키스의 답변에 대한 내 의견에 따라) 원래 코드는 '.txt'버전의 파일의 존재 여부를 확인하지 않습니다. if 문의 두 번째 절은 수정 된 파일 이름과 $ true ($ item.baseName + ")와 동일시하려고 시도합니다. txt"-eq $ true). 이 절은 항상 거짓으로 평가됩니다.
Keith의 수정은 'test-path'cmdlet을 추가합니다.이 인스턴스에서 '.txt'파일의 존재 여부를 확인합니다.
다른 팁
시도 :
gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}
.
초기 Foreach
문은 PowerShell 명령으로서 데이터를 출력 할 수 있음을 powerShell 명령으로 필요하지 않습니다.그런 다음 Where
명령으로 파이프 라인 객체를 필터링합니다.