2013-06-03 4 views
173

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

Файловая система похож на этот

D:\ 
D:\TopDirec\SubDirec\Project1\Revision1\Reports\ 
D:\TopDirec\SubDirec\Project2\Revision1\ 
D:\TopDirec\SubDirec\Project3\Revision1\ 
  • Каждый проект папка имеет несколько версий.
  • Для каждой папки изменений требуется папка «Отчеты».
  • Некоторые из папок «ревизий» уже содержат папку «Отчеты»; однако, большинство нет.

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

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

ответ

2

Из вашей ситуации звучит так, как будто вам нужно создать папку «Редакция #» один раз в день с папкой «Отчеты». Если это так, вам просто нужно знать, что такое следующий номер редакции. Напишите функцию, которая получает следующий номер версии 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

303

вы пробовали параметр -Force?

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

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

Дополнительную информацию см. В справочной статье MSDN New-Item.

+58

Для ленивых, есть сокращенная: мкр -Force C: \ Foo \ бар \ Baz –

+33

Для тех, кто не хочет никакого вывода, когда папка создана, добавьте «| Out-Null» в конце – armannvg

7

Если вы укажете флаг -Force, PowerShell не будет жаловаться, если папка уже существует.

Однострочник:

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

Кстати, для планирования задач, пожалуйста, проверьте эту ссылку: Scheduling Background Jobs.

11

У меня была такая же проблема. Вы можете использовать что-то вроде этого:

$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) 
    } 
} 
51
$path = "C:\temp\NewFolder" 
If(!(test-path $path)) 
{ 
     New-Item -ItemType Directory -Force -Path $path 
} 

Test-Path проверяет, существует ли путь. Когда этого не произойдет, он создаст новый каталог.

+3

Пожалуйста, объясните свое решение, а не просто укажите код ... – andreas

+0

Это не работает! Немного измените – Ram

+0

Это сработало для меня: New-Item -ItemType Directory -Force -path $ path –

6

Есть 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

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} 
1
$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

2

Следующий фрагмент кода поможет вам создать полный путь.

Выше функция разделяет путь, который вы передали функции, и проверяет каждую папку, существовала она или нет. Если он не существует, он создаст соответствующую папку, пока не будет создана целевая/конечная папка.

Для вызова функции, используйте ниже заявление:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder" 
Смежные вопросы