2014-02-12 2 views
0

10 개의 파일을 포함해야하는 폴더가 있습니다. 각 파일 이름은 다를 수 있지만 (이름과 확장자) 패턴을 포함합니다.powershell이 ​​파일의 디렉토리를 확인하십시오.

예 :

SomeThing.FILE0.DAT 
SomeThing.FILE1.DAT 
SomeThing.FILE2.DAT 
and so on till 
SomeThing.FILE9.DAT 

내 스크립트에는 현재 어떤 검사도 없습니다. 수동으로 실행하여 모든 파일이 있는지 확인합니다.

for ($i=0; $i -le 9; $i++) 
{ 
    $FileString = "*FILE"+$i+"*" 
    $MyFileName = Get-ChildItem e:\files -name -filter $($FileString) 
} 

그러나, 나는 프로세스를 자동화해야하는, 그래서 있는지 확인하기 위해 검사를 추가 할 :

a. Total of 10 files exist in that folder 

$FC = (Get-ChildItem c:\testing | Measure-Object).Count; 
if($FC -eq 10) 
{ 
    echo "File Count is correct" 
} 
else 
{ 
    echo "File Count is incorrect" 
} 

b. Each of the FILEX (X = 0-9) are present 
c. Only one instance of each FILEX (X = 0-9) should be present. If multiple instances of FILEX are present, I need to display it on the screen saying that FILEX pattern is repeated multiple times. 

어떻게이 남아있는 검사 할 수 있습니까? 그것은 ...

+0

질문의 첫 번째 부분에 대한 답변을 이미 제공해 주셨습니다. b 또는 c에 대해 지금까지 아무 것도 시도하지 않았습니까? 가지고 있다면, 어디서 문제가 발생합니까? –

+0

아니요. b와 c에 대해 뭔가를 얻을 수 없습니다. 모든 포인터는 감사하겠습니다. 나는 몇 달 전에 파워 쉘을 배우기 시작했습니다. – DataRiver

+0

B & C에서 * 시도 *를하십시오.이 사이트는 사람들을 위해 모든 코드를 작성하는 것이 아닙니다. – alroc

답변

1
$> if ((compare (ls -name | %{ ([regex]'(?<=.*FILE).*(?=.DAT)').match($_).groups[0].value } | Sort-Object) (0..9 | %{$_.ToString()}) -SyncWindow 0).Length -eq 0) { Write-Host "ok" } 
ok 

어 간단한 보였지만, 더 복잡하다?

질문에 "우리 디렉토리에는 *FILEX.DAT 개의 파일이 들어 있는지 확인하십시오. 여기서 X는 0과 9 사이의 가능한 모든 숫자 여야합니다."와 같은 문구가 있습니다. 파워 쉘에서는 그렇게 보일 것이다 : 우리는 ([regex]'(?<=.*FILE).*(?=.DAT)')로하고 현재 디렉토리에있는 모든 파일 이름 (여기 정규식을 구축 한

$> ls -name | %{ ([regex]'(?<=.*FILE).*(?=.DAT)').match($_).groups[0].value } 
0 
1 
2 
3 
5 
6 
7 
8 
9 
4 

:

$> if (allNumbersFromFileNames.IsEqualTo(0..9)) { Write-Info "ok" } 

는 현재 디렉토리에서 파일 이름에서 모든 번호를 얻으려면 ls -name | %{ $_ })에서 매직 넘버를 파싱하고 첫 번째로 일치하는 그룹의 값을 얻습니다.

마지막으로이 string[] 개체가 있어야 정렬하고 숫자 문자열 배열과 비교할 수 있습니다. 여기에 compare이 유용 할 수 있습니다.

e.e.

$> if ((compare 0..9 1..4).Length -eq 0) { Write-Host "equals" } 
$> if ((compare 0..9 0..9).Length -eq 0) { Write-Host "equals" } 
equals 

모두 넣으면 답변을 얻을 수 있습니다!

+0

감사합니다. "무언가"는 항상 달라질 것입니다.그래서, 어떤 방법으로 그것을 제거 할 수 있습니까? – DataRiver

+0

답변이 업데이트되었습니다. 정규식은''(? =. * FILE). * (? = .DAT) ''(? <= SomeThing.FILE). 또한 배열을 올바르게 비교하기 위해 구문 분석 된 배열 배열을 정렬합니다. –

+0

감사합니다. 이 이별은 많은 도움이됩니다. 명확하게 작성하는 데 도움을 주셔서 감사합니다. – DataRiver

0

정규 표현식 솔루션이 나에게 효과적이지 않았기 때문에 나는 조잡한 논리를 쓰지 못하게했다. 지금까지는 작동합니다. 더 나은 것이 있다면, 조언하십시오.

for ($i=0; $i -le 9; $i++) 
{ 
$FileString = "*FILE"+$i+"*" 

$ct = (Get-ChildItem "C:\testing" -name -filter $($FileString) | Measure-Object).Count 
if($ct -ne 1) 
{ 
    if($ct -eq 0) 
    { 
     write-host "FILE"$i "is missing" 
    } 
    elseif ($ct -gt 1) 
    { 
     write-host $ct" instances of FILE"$i" found" 
    } 
    else 
    { 
     write-host "God help you." 
    } 
} 
} 
관련 문제