2014-12-16 35 views
6

Her ay için (yyyy_mm biçiminde) ve her bir klasörün alt klasörlerinin her birinde belirli bir yol (birinci parametre) klasörlerinde oluşturulan bir komut dosyası oluşturdum (biçim yyyy_mm_dd)).Tüm yıl boyunca ay klasörleri ve gün alt klasörleri oluşturma

Kod çalışıyor, ancak daha kolay bir çözüm var mı?

param(
[string]$inppath = '', 
[string]$inpyear = '0' 
) 
function dayfolder 
{ 
    1..[DateTime]::DaysInMonth($inpyear,$month) | ForEach-Object { 
    $day = $_ 
    New-Item -ItemType directory -Force -Path ($inppath + '\' + $inpyear + '_' + ("{0:D2}" -f $month) + '\' + $inpyear + '_' + ("{0:D2}" -f $month) + '_' + ("{0:D2}" -f $day)) } 
} 

if ($inppath -eq '') 
{ 
    echo 'No path in input! First parameter!' 
} 
else 
{ 
    if ($inpyear -eq '0') 
    { 
     echo 'No year in input! Second parameter! Format: YYYY' 
    } 
    else 
    { 
    1..12 | ForEach-Object { 
      $month = $_ 
      New-Item -ItemType directory -Force -Path ($inppath + '\' + $inpyear + '_' + ("{0:D2}" -f $month)) 
      dayfolder 
      } 
    }  
} 

cevap

5

Sana aşırı Tartışmalarınızın için varsayılan değerleri sağlayan ve varsayılan kullanıldığında sonra hata mesajları vererek komplike şeyler yapıyoruz düşünüyorum. Eğer parametrelerin zorunlu olmasını istiyorsanız, bunları böyle beyan etmelisiniz. Aslında daha ileri gidebilir ve belirli bir aralıkta geçerli bir yol ve bir sayı olarak ilan edebilirsiniz. Aksi takdirde benim yeni gözlemimin ihtiyaç duyduğu herhangi bir ana öğe oluşturmasıdır, bu nedenle ay klasörlerini ayrı olarak oluşturmanız gerekmez.

Yol dizgisini oluşturmanın çeşitli yolları vardır, ancak bence bu durumda ay ve günü biçimlendirmek en basit olanıdır ve sonra sadece tek bir dize kullanmaktadır (_ değişken adında geçerli bir karakter olduğunu unutmayın. Eğer bazı durumlarda değişken genişleme) ait ${...} formunu kullanmak zorunda:

param(
    # Path to an existing folder. 
    [Parameter(Mandatory=$True)] 
    [ValidateScript({Test-Path $_ -PathType 'Container'})] 
    [string]$inppath, 

    # Year must be fairly recent or in the future. Warranty expires 2100 
    [Parameter(Mandatory=$True)] 
    [ValidateRange(1999,2100)] 
    [int]$inpyear 
) 

1..12 | ForEach-Object { 
    $month = "{0:D2}" -f $_ 
    1..[DateTime]::DaysInMonth($inpyear,$month) | ForEach-Object { 
     $day = "{0:D2}" -f $_ 
     New-Item -ItemType directory -Force -Path "$inppath\${inpyear}_$month\${inpyear}_${month}_${day}" 
    } 
} 

tek şey sık sık bu kullanmak istiyorsanız, o zaman bir fonksiyonu veya cmdlet ve çevirmek için daha iyi olurdu olmasıdır diğer cmdlet'lerle bir modülde tutabilirsiniz. Ayrıca, her bir parametreden önce bu yorumu yaparsanız, yardım ekranının bir parçası olur ve işlev bildiriminin üst kısmındaki bir yorumda yardım ekranına ilişkin bir açıklama ve örnekler ekleyebilirsiniz.

P.S. Bloody powershell yeni başlayanlar için tavsiye ederim. http://www.microsoftvirtualacademy.com/training-courses/getting-started-with-powershell-3-0-jump-start

+0

Çok teşekkürler! bu kadar kolay! –

3

İşte benim yaklaşımım. Sadece parametre doğrulama (ı @Duncan gibi yaptığını yapardı) eksik: Komut Aşağıda

$inpyear = 2012 
$inppath = 'D:\temp\ps' 
$startday = [datetime]"$inpyear-01-01" 

0..(New-TimeSpan -Start $startday -End "$inpyear-12-31").TotalDays | select @{name='subpath'; expression={$startday.AddDays($_).ToString('yyyy_MM\\yyyy_MM_dd')}} | foreach { 
    New-Item -ItemType Directory -Path (Join-Path $inppath -ChildPath $_.subpath) -Force 
} 
+1

muhtemelen bunun 4.0 gerektirdiğini söylemelisiniz – Paul

-1

:

$path ="[Path]\" 
$months = "April 2018","May 2018","June 2018","July 2018","August 2018","September 2018","October 2018","November 2018","December 2018","January 2019","February 2019","March 2019" 
foreach($month in $months) 
{ 
    New-Item -ItemType Directory -Path "$path$month" 
} 
İlgili konular