Varsa dizin oluştur


342

Ben yoksa birkaç dizin oluşturmak için bir PowerShell komut dosyası yazıyorum.

Dosya sistemi buna benzer

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Her proje klasörü birden fazla düzeltmeye sahiptir.
  • Her bir revizyon klasörü bir Reports klasörüne ihtiyaç duyar.
  • "Düzeltmeler" klasörlerinden bazıları zaten bir Rapor klasörü içerir; ancak, çoğu değil.

Her dizin için bu klasörleri oluşturmak için günlük çalışan bir komut dosyası yazmanız gerekir.

Bir klasör oluşturmak için komut dosyasını yazabiliyorum, ancak birkaç klasör oluşturmak sorunlu.


3
"birkaç klasör oluşturmak sorunlu" - ne tür bir sorun yaşıyorsunuz? Morina nasıl yazılacağından emin değil misiniz? Bir hata mesajı alıyor musunuz? Komut dosyası çalıştırıldıktan sonra klasörler görünmüyor mu? Farklı problemler farklı çözümler gerektirir.
LarsH

Yanıtlar:


536

-ForceParametreyi deneyin :

New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist

Önce Test-Path -PathType Containerkontrol etmek için kullanabilirsiniz .

Daha fazla ayrıntı için Yeni Öğe MSDN yardım makalesine bakın.


101
Tembel için bir stenografi vardır: md -Force c: \ foo \ bar \ baz
Matthew Fellows

74
Klasör oluşturulduğunda herhangi bir çıktı istemeyenler için, sonuna "| Out-Null" ekleyin
armannvg

20
-Force aslında ne yapacak? Dokümantasyon diyor "Kuvvetler bu cmdlet o varolan salt okunur öğenin üzerine yazma bir öğe oluşturmak için" . Mevcut bir klasörü silecek mi? Bu cevapta açık olması gerekir.
Peter Mortensen

25
@PeterMortensen Dizinlerde, onları zorlamak mevcut içeriği temizlemez, yalnızca zaten oluşturulduğunu söyleyen hata mesajını bastırır. Bu komut aynı zamanda gerekli tüm araya giren klasörleri oluşturur ve bu klasörlerin içeriği zaten varsa güvenlidir.
John Neuhaus

162
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
      New-Item -ItemType Directory -Force -Path $path
}

Test-Pathyolun mevcut olup olmadığını kontrol eder. Başlamazsa, yeni bir dizin oluşturur.


Güzel! Dizin zaten varsa (bu, kullandığından test-path) çıktıyı susturur .
Savaş Gibi Şempanze

17

Aşağıdaki kod snippet'i, tam bir yol oluşturmanıza yardımcı olur.

Function GenerateFolder($path) {
    $global:foldPath = $null
    foreach($foldername in $path.split("\")) {
        $global:foldPath += ($foldername+"\")
        if (!(Test-Path $global:foldPath)){
            New-Item -ItemType Directory -Path $global:foldPath
            # Write-Host "$global:foldPath Folder Created Successfully"
        }
    }
}

Yukarıdaki işlev, işleve ilettiğiniz yolu böler ve her klasörü var olup olmadığını kontrol eder. Yoksa, hedef / son klasör oluşturulana kadar ilgili klasörü oluşturur.

İşlevi çağırmak için aşağıdaki ifadeyi kullanın:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"

1
Bu en kolay olanı değil, anlaşılması kolay olanıdır.
Wang Jijun

13

Ben de aynı problemi yaşadım. Bunun gibi bir şey kullanabilirsiniz:

$local = Get-Location;
$final_local = "C:\Processing";

if(!$local.Equals("C:\"))
{
    cd "C:\";
    if((Test-Path $final_local) -eq 0)
    {
        mkdir $final_local;
        cd $final_local;
        liga;
    }

    ## If path already exists
    ## DB Connect
    elseif ((Test-Path $final_local) -eq 1)
    {
        cd $final_local;
        echo $final_local;
        liga;  (function created by you TODO something)
    }
}

11

-ForceBayrağı belirttiğinizde , PowerShell klasör zaten varsa şikayet etmeyecektir.

Tek astarı:

Get-ChildItem D:\TopDirec\SubDirec\Project* | `
  %{ Get-ChildItem $_.FullName -Filter Revision* } | `
  %{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }

BTW, görevi zamanlamak için lütfen şu bağlantıya göz atın: Arka Plan İşlerini Zamanlama .


10

kullanın:

$path = "C:\temp\"

If (!(test-path $path))
{
    md C:\Temp\
}
  • İlk satır adlı bir değişken oluşturur $pathve bu değişkene "C: \ temp \" dize değerini atar

  • İkinci satır bir olduğunu Ifdayanır açıklamada Test-Yol değişkeni kontrol etmek cmdlet'in $pathyok değil var. Mevcut değil !sembolü kullanılarak nitelendirilir .

  • Üçüncü satır: Yukarıdaki dizede saklanan yolu ise değil bulundu, kıvırcık parantez kod çalışacaktır.

md yazmanın kısa sürümüdür: New-Item -ItemType Directory -Path $path

Not: -ForceYol zaten mevcutsa istenmeyen davranış olup olmadığını görmek için aşağıdaki parametreyi kullanarak test etmedim .

New-Item -ItemType Directory -Path $path

1
bu aynı zamanda md "C:\first\second\thirdhepsini oluşturan bir dizin hiyerarşisi için de işe yarar.
MortenB

9

PowerShell kullanarak dizin oluşturmanın üç yolunu biliyorum:

Method 1: PS C:\> New-Item -ItemType Directory -path "C:\livingston"

Resim açıklamasını buraya girin

Method 2: PS C:\> [system.io.directory]::CreateDirectory("C:\livingston")

Resim açıklamasını buraya girin

Method 3: PS C:\> md "C:\livingston"

Resim açıklamasını buraya girin


Md`nin Linux / Unix mkdir komutuna benzer bir windows komutu olan mkdir `(make directory) için Powershell varsayılan takma adı olduğunu unutmayın. ref: `Get-Alias
md`

4

Durumunuzdan, "Raporlar" klasörü ile günde bir kez "Revizyon #" klasörü oluşturmanız gerektiği anlaşılıyor. Bu durumda, bir sonraki revizyon numarasının ne olduğunu bilmeniz gerekir. Bir sonraki düzeltme numarasını (Get-NextRevisionNumber) alan bir işlev yazın. Veya böyle bir şey yapabilirsiniz:

foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){
    # Select all the Revision folders from the project folder.
    $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory

    # The next revision number is just going to be one more than the highest number.
    # You need to cast the string in the first pipeline to an int so Sort-Object works.
    # If you sort it descending the first number will be the biggest so you select that one.
    # Once you have the highest revision number you just add one to it.
    $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1

    # Now in this we kill two birds with one stone.
    # It will create the "Reports" folder but it also creates "Revision#" folder too.
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory

    # Move on to the next project folder.
    # This untested example loop requires PowerShell version 3.0.
}

PowerShell 3.0 kurulumu .


2

Kullanıcıların bazı ayarları geçersiz kılmak için PowerShell için varsayılan bir profil oluşturmasına izin vermek istedim ve aşağıdaki tek satırlı (birden çok ifade evet, ancak PowerShell'e yapıştırılabilir ve bir kerede çalıştırılabilir, bu da ana hedefti) ):

cls; [string]$filePath = $profile; [string]$fileContents = '<our standard settings>'; if(!(Test-Path $filePath)){md -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; $fileContents | sc $filePath; Write-Host 'File created!'; } else { Write-Warning 'File already exists!' };

Okunabilirlik için, bunun yerine bunu bir .ps1 dosyasında nasıl yaparım:

cls; # Clear console to better notice the results
[string]$filePath = $profile; # Declared as string, to allow the use of texts without plings and still not fail.
[string]$fileContents = '<our standard settings>'; # Statements can now be written on individual lines, instead of semicolon separated.
if(!(Test-Path $filePath)) {
  New-Item -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; # Ignore output of creating directory
  $fileContents | Set-Content $filePath; # Creates a new file with the input
  Write-Host 'File created!';
}
else {
  Write-Warning "File already exists! To remove the file, run the command: Remove-Item $filePath";
};

1

İşte benim için çalışan basit bir tane. Yolun var olup olmadığını kontrol eder ve eğer yoksa, sadece kök yolu değil tüm alt dizinleri de oluşturur:

$rptpath = "C:\temp\reports\exchange"

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.