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


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
실제로 -Force는 어떻게합니까? 문서는 말한다 "힘이 cmdlet이 기존 읽기 전용 항목 위에 쓰기 항목을 만들" . 기존 폴더를 삭제합니까? 이 답변에서 분명해야합니다.
피터 Mortensen

25
@PeterMortensen 디렉토리의 경우 강제로 기존 컨텐츠를 지우지 않으면 이미 작성된 오류 메시지 만 표시하지 않습니다. 이 명령은 필요한 중간 폴더도 생성하며 해당 폴더의 내용도 이미 존재하는 경우 안전합니다.
John Neuhaus

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

Test-Path경로가 존재하는지 확인합니다. 그렇지 않으면 새 디렉토리를 작성합니다.


좋은! 디렉토리가 이미 존재하는 경우 (이를 사용하기 때문에) 출력을 침묵시킵니다 test-path.
Warlike 침팬지

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
이것은 가장 쉬운 것이 아니지만 이해하기 쉬운 것입니다.
Wang Jijun

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에 의존 문 테스트 경로의 변수가 있는지 확인하는 cmdlet를 $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`는 Linux / Unix mkdir과 ​​유사한 Windows 명령 인`mkdir` (make directory)의 Powershell 기본 별명 일뿐입니다. REF :`은 Get-별칭은`md로
BentChainRing

4

상황에 따라 "Reports"폴더가있는 "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 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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.