Створіть каталог, якщо він не існує


342

Я пишу сценарій PowerShell для створення декількох каталогів, якщо вони не існують.

Файлова система схожа на цю

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Кожна папка проекту має кілька змін.
  • Кожна папка редакції потребує папки Reports.
  • Деякі папки "редакції" вже містять папку "Звіти"; однак, більшість ні.

Мені потрібно написати сценарій, який працює щодня, щоб створити ці папки для кожного каталогу.

Я в змозі написати сценарій для створення папки, але створити кілька папок проблематично.


3
"створити кілька папок проблематично" - яка проблема у вас є? Ви не знаєте, як написати тріску? Ви отримуєте повідомлення про помилку? Чи папки просто не з’являються після запуску сценарію? Різні проблеми потребують різного вирішення.
LarsH

Відповіді:


536

Спробуйте -Forceпараметр:

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

Ви можете використовувати Test-Path -PathType Containerдля перевірки спочатку.

Дивіться New-Item MSDN довідкову статтю для більш докладної інформації.


101
Для ледачих є стенограма: md -Force c: \ foo \ bar \ baz
Matthew Fellows

74
Для тих, хто не хоче жодного виводу при створенні папки, додайте "| Out-Null" наприкінці
armannvg

20
Що буде насправді -силою? У документації йдеться про те, що "змушує цей командлет створити елемент, який пише над існуючим елементом, доступним лише для читання" . Чи видалить існуючу папку? У цій відповіді має бути зрозуміло.
Пітер Мортенсен

25
@PeterMortensen У випадку каталогів, примушуючи їх не очищати наявний вміст, він лише придушує повідомлення про помилку, кажучи, що воно вже створене. Ця команда також створить необхідні папки, що втручаються, і вміст цих папок також є безпечним, якщо вони вже є.
Джон Нойгаус

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

Test-Pathперевіряє, чи існує шлях. Коли цього не відбувається, він створить новий каталог.


Приємно! Це замовчує вихід, якщо каталог вже існує (тому що він використовується test-path).
Войовничий шимпанзе

17

Наступний фрагмент коду допоможе вам створити повний шлях.

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

Вищенаведена функція розділила шлях, який ви пройшли до функції, і перевірить, чи існує вона чи ні. Якщо його немає, він створить відповідну папку, поки не буде створена цільова / остаточна папка.

Для виклику функції скористайтеся нижче оператором:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"

1
Цей не найпростіший, але легкий для розуміння.
Ван Джіджун

13

У мене була точно така ж проблема. Ви можете використовувати щось подібне:

$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

Коли ви вкажете -Forceпрапор, PowerShell не поскаржиться, якщо папка вже існує.

Одноколісний:

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

BTW, для планування завдання перейдіть за цим посиланням: Планування фонових завдань .


10

Використання:

$path = "C:\temp\"

If (!(test-path $path))
{
    md C:\Temp\
}
  • Перший рядок створює змінну з назвою $pathта присвоює їй значення рядка "C: \ temp \"

  • Другий рядок являє собою Ifзаяву , яке спирається на Test-Path командлет , щоб перевірити , якщо змінна $pathмає НЕ існує. Не існує, кваліфікується за допомогою !символу.

  • Третій рядок: Якщо шлях, збережений у рядку вище, не знайдеться, код між фігурними дужками буде запущений.

md - це коротка версія введення тексту: New-Item -ItemType Directory -Path $path

Примітка: Я не перевіряв використання -Force параметр нижче, щоб побачити, чи є небажана поведінка, якщо шлях вже існує.

New-Item -ItemType Directory -Path $path

1
це також працює для створення ієрархії каталогів md "C:\first\second\third.
MortenB

9

Я знаю три способи створення каталогу за допомогою PowerShell:

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

Введіть тут опис зображення

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

Введіть тут опис зображення

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

Введіть тут опис зображення


Зауважте, що `md` - просто псевдонім Powershell за замовчуванням для` mkdir` (make каталог), команда Windows, схожа на Linux / Unix mkdir. ref: `Get-Alias
md`

4

З вашої ситуації здається, що вам потрібно створити папку "Редакція №" один раз на день із папкою "Звіти". Якщо це так, вам просто потрібно знати, що таке наступний номер редакції. Напишіть функцію, яка отримує наступний номер редакції, Get-NextRevisionNumber. Або ви могли зробити щось подібне:

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 .


2

Я хотів, щоб я міг легко дозволити користувачам створити профіль за замовчуванням, щоб PowerShell заміняв деякі налаштування, і в кінцевому підсумку вийшов наступний одноклапник (декілька висловлювань так, але можна вставити в PowerShell і виконати одразу, що було головною метою ):

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

Для читабельності, ось як я це зробив би у файлі .ps1 замість цього:

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

Ось простий, який працював на мене. Він перевіряє, чи існує шлях, і якщо його немає, він створить не тільки кореневий шлях, але й усі підкаталоги:

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.