Na początku potrzebujemy funkcję do iteracji po dacie:
function Iterate-Date
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$True,Position=1)]
[ValidateNotNull()]
[DateTime]
$startDate
,
[Parameter(Mandatory=$True,Position=2)]
[ValidateNotNull()]
[DateTime]
$endDate
)
for($i = $startDate; $i -le $endDate; $i = $i.AddDays(1))
{
$i
}
}
Potrzebna będzie funkcja sprawdzająca czy istnieje nazwa pliku z podanym patternem:function Test-FileName
{
param(
[string]$path='.'
)
process{
$filter= $_
$items = gci -Path $path -Filter $filter
new-object PSObject | Add-Member -MemberType NoteProperty -Name Filter -Value $filter -PassThru |
Add-Member -MemberType NoteProperty -Name Items -Value $items -PassThru |
Add-Member -MemberType NoteProperty -Name Contains -Value ([bool]$items) -PassThru
}
}
Samo sprawdzanie czy istnieje plik z patternem yyyy-MM-dd* jest poniżej:Iterate-Date -startDate ([DateTime]("2005-02-13")) ([DateTime]("2014-06-16")) |
%{ $_.ToString('yyyy-MM-dd') + "*"} | group | %{$_.name} |
Test-FileName |
? {-not $_.Contains}
Aby uprościć powyższe wywołanie to możemy zamienić group za pomocą poniższej funkcji:function Get-KeyGroupObject
{
param(
[string]
$keyPropName = 'name'
)
#in variable $input (enumerator type) we have all items
$Input | group | %{$_.$keyPropName}
}
A sprawdzanie wygląda następująco:Iterate-Date -startDate ([DateTime]("2005-02-13")) ([DateTime]("2014-06-16")) |
%{ $_.ToString('yyyy') + "*"} | Get-KeyGroupObject |
Test-FileName |
? {-not $_.Contains}
Brak komentarzy:
Prześlij komentarz