2014-02-12 124 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找到東西。任何指針讚賞。幾個月前我開始學習PowerShell。 – 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之間的每一個可能的數字」。在PowerShell中它應該是這個樣子的是:

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

我們構建的正則表達式這裏([regex]'(?<=.*FILE).*(?=.DAT)'),並在當前目錄下的每個文件名(:

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

從當前目錄中獲取文件名從所有號碼ls -name | %{ $_ })解析其中的幻數並獲得第一個匹配組的值。

最後,我們需要有這個string[]對象,對它進行排序並與數組字符串進行比較。 compare在這裏可能很有用。

I.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)。*(?=。DAT)''正則表達式變成''此外,還會添加對已分析數字數組的排序,以正確比較數組。 –

+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." 
    } 
} 
}