문제

일련의 디렉토리와 하위 디렉토리를 확인하여 동일한 폴더에 동일한 이름이있는 두 개 이상의 파일이 있는지 확인하려고합니다.나는 내 문제가 문자열을 검증하려고하는 방법이라고 생각합니다.

다음 테스트 디렉토리의 경우 :

  • | - C : \ test \
    • --c : \ test \ yy \
      • --c : \ test \ yy \ xx.log
      • --c : \ test \ yy \ xx.txt
    • | - 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 명령으로 파이프 라인 객체를 필터링합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top