programing

디렉토리가 존재하지 않는 경우 작성

powerit 2023. 4. 8. 09:51
반응형

디렉토리가 존재하지 않는 경우 작성

여러 개의 디렉토리가 없는 경우 생성하기 위해 PowerShell 스크립트를 작성합니다.

파일 시스템이 이와 유사합니다.

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • 각 프로젝트 폴더에는 여러 리비전이 있습니다.
  • 각 리비전 폴더에는 보고서 폴더가 필요합니다.
  • 일부 "revisions" 폴더에는 이미 Reports 폴더가 포함되어 있지만 대부분은 포함되어 있지 않습니다.

각 디렉토리에 대해 이러한 폴더를 작성하기 위해 매일 실행되는 스크립트를 작성해야 합니다.

폴더를 작성하는 스크립트를 작성할 수 있지만 폴더를 여러 개 만드는 것은 문제가 있습니다.

해 보다-Force★★★★★★★★★★★★★★★★★★:

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

를 사용하여 먼저 확인할 수 있습니다.

자세한 내용은 New-Item MSDN 도움말 문서를 참조하십시오.

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

Test-Path -PathType container는 경로가 존재하며 디렉토리인지 여부를 확인합니다.그렇지 않으면 새 디렉토리가 생성됩니다.의해 오류가 합니다(New-Item을 수 ).-force인수(위험한 경우)를 입력합니다.

[System.IO.Directory]::CreateDirectory('full path to directory')

이것은 내부적으로 디렉토리의 존재를 확인하고 디렉토리가 없는 경우 디렉토리를 작성합니다.한 줄에 원어민만.NET 메서드는 완벽하게 동작합니다.

용도:

$path = "C:\temp\"
    
If (!(test-path $path))
{
    md $path
}
  • 은 변수 이름인 변수를 .$path에 의해 "C가 할당됩니다.

  • 은 ''입니다.IfTest-Path cmdlet에 의존하여 변수 여부를 확인합니다.$path는 존재하지 않습니다.존재하지 않는 것은 다음 명령어를 사용하여!★★★★★★ 。

  • 세 번째 줄:위의 문자열에 저장된 경로를 찾을 수 없는 경우 대괄호 사이의 코드가 실행됩니다.

md입니다.New-Item -ItemType Directory -Path $path

주의: 테스트한 적이 없습니다.-Force패스가 이미 존재하는 경우 바람직하지 않은 동작이 있는지 여부를 확인하려면 다음 파라미터를 사용합니다.

New-Item -ItemType Directory -Path $path

다음 코드 스니펫은 완전한 경로를 만드는 데 도움이 됩니다.

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"

나도 똑같은 문제가 있었어.다음과 같은 것을 사용할 수 있습니다.

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

「 」를 -Force플래그가 표시됩니다.PowerShell을 사용합니다.

원라이너:

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

BTW, 작업 스케줄에 대해서는 다음 링크를 확인하십시오.백그라운드 작업 스케줄링.

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"

여기에 이미지 설명을 입력하십시오.

고객님의 상황에서는 하루에 한 번씩 "Reports" 폴더를 만들고 거기에 "Reports" 폴더를 넣어야 할 것 같습니다.이 경우 다음 리비전 번호가 무엇인지 알면 됩니다.다음 리비전 번호인 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 설치

여기 제게 효과가 있었던 간단한 것이 있습니다.경로가 존재하는지 확인하고 존재하지 않으면 루트 경로뿐만 아니라 모든 하위 디렉터리도 만듭니다.

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

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

사용자가 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";
};
$mWarningColor = 'Red'

<#
.SYNOPSIS
    Creates a new directory. 
.DESCRIPTION
    Creates a new directory. If the directory already exists, the directory will
    not be overwritten. Instead a warning message that the directory already
    exists will be output.
.OUTPUT
    If the directory already exists, the directory will not be overwritten.
    Instead a warning message that the directory already exists will be output.
.EXAMPLE    
    Sal-New-Directory -DirectoryPath '.\output'
#>
function Sal-New-Directory {
    param(
        [parameter(mandatory=$true)]
        [String]
        $DirectoryPath
    )
    $ErrorActionPreference = "Stop"
    try {
        if (!(Test-Path -Path $DirectoryPath -PathType Container)) {

            # Sal-New-Directory is not designed to take multiple 
            # directories. However, we use foreach to supress the native output
            # and substitute with a custom message.
            New-Item -Path $DirectoryPath -ItemType Container | `
              foreach {'Created ' + $_.FullName}
        } else {
            Write-Host "$DirectoryPath already exists and" `
                        "so will not be (re)created." `
                        -ForegroundColor $mWarningColor
        }
    } finally {
        $ErrorActionPreference = "Continue"
    }
}

"sal"은 제 도서관의 임의 접두사일 뿐입니다.제거할 수도 있고 자신의 것으로 교체할 수도 있습니다.

또 다른 예(stackoverflow 구문의 하이라이팅이 무효가 되기 때문에 여기에 둡니다.

Sal-New-Directory -DirectoryPath ($mCARootDir + "private\")

예를 들어, 스크립트 폴더 내에 'Reports' 폴더를 만듭니다.

$ReportsDir = $PSScriptRoot + '\Reports'
$CreateReportsDir = [System.IO.Directory]::CreateDirectory($ReportsDir) 

언급URL : https://stackoverflow.com/questions/16906170/create-directory-if-it-does-not-exist

반응형