Стварыць каталог, калі ён не існуе

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

Файлавая сістэма выглядае прыкладна так

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Кожная папка праекта мае некалькі версій.
  • Кожная папка рэдакцыя мае патрэбу ў тэчцы Справаздачы.
  • Некаторыя з папкі «рэвізій» ўжо ўтрымліваюць тэчку Reports; Аднак, большасць гэтага не робяць.

Мне трэба напісаць скрыпт, які працуе штодня, каб стварыць гэтыя тэчкі для кожнага каталога.

Я магу напісаць сцэнар, каб стварыць тэчку, але стварыць некалькі тэчак праблематычна.

211
«Стварэнне некалькіх папак праблематычна» - якія праблемы вы з? Вы не ведаеце, як пісаць трэску? Вы атрымліваеце паведамленне пра памылку? Ёсць тэчкі проста не з'яўляюцца пасля запуску сцэнара? Розныя праблемы патрабуюць розных рашэнняў.
дададзена аўтар LarsH, крыніца

10 адказы

Вы спрабавалі -Force параметр?

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

Вы можаце выкарыстоўваць <�код > Test-Path -PathType Кантэйнер , каб праверыць.

Глядзіце New-Item даведачнай артыкуле MSDN для атрымання больш падрабязнай інфармацыі.

358
дададзена
Для лянівых, ёсць скарочаная: мкр -Force C: \ Foo \ бар \ Baz
дададзена аўтар Matthew Fellows, крыніца
@PeterMortensen У выпадку каталогаў, прымушаючы іх не выдаліць з існуючага змесціва, ён душыць толькі паведамленне пра памылку сказаўшы, што гэта ўжо створана. Гэтая каманда таксама будзе ствараць якія-небудзь прамежкавыя тэчкі неабходныя, і змесціва гэтых тэчак таксама бяспечна, калі яны ўжо існуюць.
дададзена аўтар John Neuhaus, крыніца
Для тых, хто не хоча ніякіх выходных дадзеных, калі ствараецца папка, дадаць «| Out-Null» у канцы
дададзена аўтар armannvg, крыніца
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
      New-Item -ItemType Directory -Force -Path $path
}

Test-Path checks to see if the path exists. When it does not, it will create a new directory.

76
дададзена
Калі ласка, растлумачце сваё рашэнне, а не даваць толькі код ...
дададзена аўтар andreas, крыніца
Гэта працуе для мяне: New-Item -ItemType Directory -Force -Path $ шлях
дададзена аўтар Nicolas Giszpenc, крыніца
Гэта не працуе! Зрабіць невялікае змяненне бітнага
дададзена аўтар Ram, крыніца

У мяне была дакладна такая ж праблема. Вы можаце выкарыстоўваць нешта накшталт гэтага:

$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)
    }
}
12
дададзена

Пры ўказанні -Force сцяг, PowerShell не будзе скардзіцца, калі тэчка ўжо існуе.

Адзін лайнер:

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

Дарэчы, для планавання задач, калі ласка, праверце гэтую спасылку: Планаванне Фонавыя заданні .

7
дададзена

Ёсць 3 спосабу, я ведаю, каб стварыць каталог з дапамогай PowerShell

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

enter image description here

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

enter image description here

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

enter image description here

7
дададзена

Наступны фрагмент кода дапаможа вам стварыць поўны шлях.

 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"
4
дададзена
Гэта адзін не самы просты, але гэта лёгка адзін для разумення.
дададзена аўтар Wang Jijun, крыніца

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

cls; [string]$filePath = $profile; [string]$fileContents = ''; 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 = ''; # 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";
};
2
дададзена

Ад вашай сітуацыі гэта гучыць, як вам трэба, каб стварыць «Revision #» тэчку адзін раз у дзень з тэчкай «Справаздачы» у там. Калі гэта так, то вам проста неабходна ведаць, што наступны нумар рэвізіі. Напішыце функцыю, якая атрымлівае нумар наступнай рэвізіі 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 2 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 installation

2
дададзена

Вось просты адзін, які працаваў для мяне. Ён правярае, ці існуе шлях, і калі няма, то ён будзе ствараць не толькі каранёвай шлях, але ўсё падкаталогі таксама:

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
1
дададзена
$path = "C:\temp\"

If(!(test-path $path))

{md C:\Temp\}
  • Першы радок стварае зменную з імем $ шлях і прысвойвае яму радковае значэнне "C: \ Temp \"

  • Другая радок з'яўляецца Калі заяву, якое абапіраецца на Test-Path командлета, каб праверыць, калі зменная $ шлях не існуе. Не існуе кваліфікаваны, выкарыстоўваючы </код сімвала>

  • Трэцяя радок: калі шлях захоўваецца ў прыведзенай вышэй радку не знойдзены, то код паміж фігурнымі дужкамі будзе працаваць

md is the short version of typing out: <�Код> New-Item -ItemType Каталог -Path $ шлях

Заўвага: Я не правяраў, выкарыстоўваючы -Force параметр з ніжэй, каб убачыць, калі ёсць непажаданае паводзіны, калі шлях ужо існуе.

<�Код> New-Item -ItemType Каталог -Path $ шлях

1
дададзена