Buat direktori jika tidak ada

341

Saya menulis skrip PowerShell untuk membuat beberapa direktori jika tidak ada.

Sistem file terlihat mirip dengan ini

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Setiap folder proyek memiliki beberapa revisi.
  • Setiap folder revisi memerlukan folder Laporan.
  • Beberapa folder "revisi" sudah berisi folder Laporan; Namun, sebagian besar tidak.

Saya perlu menulis skrip yang berjalan setiap hari untuk membuat folder ini untuk setiap direktori.

Saya dapat menulis skrip untuk membuat folder, tetapi membuat beberapa folder bermasalah.

ecollis6
sumber
3
"Membuat beberapa folder bermasalah" - masalah apa yang Anda miliki? Apakah Anda tidak yakin cara menulis cod? Apakah Anda menerima pesan kesalahan? Apakah folder tidak muncul setelah skrip dijalankan? Masalah yang berbeda memerlukan solusi yang berbeda pula.
LarsH

Jawaban:

535

Coba -Forceparameternya:

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

Anda dapat menggunakannya Test-Path -PathType Containeruntuk memeriksa terlebih dahulu.

Lihat artikel bantuan MSDN Item Baru untuk detail lebih lanjut.

Andy Arismendi
sumber
101
Bagi mereka yang malas, ada sebuah singkatan: md -Force c: \ foo \ bar \ baz
Matthew Fellows
74
Bagi mereka yang tidak menginginkan keluaran apa pun saat folder dibuat, tambahkan "| Out-Null" di bagian akhir
armannvg
20
Apa yang sebenarnya akan-Force lakukan? Dokumentasi mengatakan "Paksa cmdlet ini untuk membuat item yang menulis di atas item read-only yang ada" . Apakah akan menghapus folder yang ada? Seharusnya jelas dalam jawaban ini.
Peter Mortensen
25
@PeterMortensen Dalam kasus direktori, memaksa mereka tidak menghapus konten yang ada, itu hanya menekan pesan kesalahan yang mengatakan itu sudah dibuat. Perintah ini juga akan membuat folder apa pun yang diperlukan, dan konten folder tersebut juga aman jika sudah ada.
John Neuhaus
160
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
      New-Item -ItemType Directory -Force -Path $path
}

Test-Pathmemeriksa untuk melihat apakah jalur itu ada. Ketika tidak, itu akan membuat direktori baru.

Tamu
sumber
Bagus! Ini membungkam keluaran jika direktori sudah ada (karena menggunakan test-path).
Simpanse Warlike
17

Cuplikan kode berikut membantu Anda membuat jalur lengkap.

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

Fungsi di atas memecah jalur yang Anda lewati ke fungsi dan akan memeriksa setiap folder apakah ada atau tidak. Jika tidak ada itu akan membuat folder masing-masing sampai folder target / final dibuat.

Untuk memanggil fungsi, gunakan pernyataan di bawah ini:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
Naredla Nithesh Reddy
sumber
1
Yang ini bukan yang termudah, tetapi yang mudah dimengerti.
Wang Jijun
solusi bagus! terima kasih;)
Alberto S.
13

Saya memiliki masalah yang sama persis. Anda dapat menggunakan sesuatu seperti ini:

$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)
    }
}
pykimera
sumber
11

Ketika Anda menentukan -Force benderanya, PowerShell tidak akan mengeluh jika folder tersebut sudah ada.

Satu-liner:

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

BTW, untuk menjadwalkan tugas, periksa tautan ini: Menjadwalkan Pekerjaan Latar Belakang .

Klark
sumber
10

Menggunakan:

$path = "C:\temp\"

If (!(test-path $path))
{
    md C:\Temp\
}
  • Baris pertama membuat variabel bernama $pathdan memberinya nilai string "C: \ temp \"

  • Baris kedua adalah Ifpernyataan yang bergantung pada Test-jalan cmdlet untuk memeriksa apakah variabel $pathtidak tidak ada. Tidak ada memenuhi syarat menggunakan !simbol.

  • Baris ketiga: Jika jalur yang disimpan dalam string di atas tidak ditemukan, kode antara kurung keriting akan dijalankan.

md adalah versi singkat pengetikan: New-Item -ItemType Directory -Path $path

Catatan: Saya belum diuji menggunakan -Forceparameter dengan di bawah ini untuk melihat apakah ada perilaku yang tidak diinginkan jika jalur sudah ada.

New-Item -ItemType Directory -Path $path
Kyle
sumber
1
ini juga berfungsi untuk membuat hierarki direktori md "C:\first\second\thirdsemuanya.
MortenB
9

Ada tiga cara yang saya tahu untuk membuat direktori menggunakan PowerShell:

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

Masukkan deskripsi gambar di sini

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

Masukkan deskripsi gambar di sini

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

Masukkan deskripsi gambar di sini

George Livingston
sumber
Perhatikan bahwa `md` hanyalah alias default Powershell untuk` mkdir` (make direktori), perintah windows mirip dengan Linux / Unix mkdir. ref: `Get-Alias
md`
4

Dari situasi Anda, sepertinya Anda perlu membuat folder "Revisi #" sekali sehari dengan folder "Laporan" di sana. Jika itu masalahnya, Anda hanya perlu tahu apa nomor revisi berikutnya. Tulis fungsi yang mendapatkan nomor revisi berikutnya, Dapatkan-NextRevisionNumber. Atau Anda dapat melakukan sesuatu seperti ini:

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

Instalasi PowerShell 3.0 .

JAHAT
sumber
2

Saya ingin dapat dengan mudah membiarkan pengguna membuat profil default untuk PowerShell untuk mengesampingkan beberapa pengaturan, dan berakhir dengan satu-liner berikut (beberapa pernyataan ya, tetapi dapat disisipkan ke dalam PowerShell dan dieksekusi sekaligus, yang merupakan tujuan utama ):

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!' };

Untuk keterbacaan, inilah cara saya melakukannya dalam file .ps1 sebagai gantinya:

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";
};
Johny Skovdal
sumber
1

Inilah yang sederhana yang bekerja untuk saya. Ia memeriksa apakah path ada, dan jika tidak, itu akan membuat tidak hanya path root, tetapi semua sub-direktori juga:

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
tklone
sumber