สร้างไดเรกทอรีหากไม่มีอยู่


342

ฉันกำลังเขียนสคริปต์ PowerShell เพื่อสร้างหลายไดเรกทอรีหากไม่มีอยู่

ระบบไฟล์มีลักษณะคล้ายกับสิ่งนี้

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • แต่ละโฟลเดอร์โครงการมีหลายการแก้ไข
  • แต่ละโฟลเดอร์การแก้ไขจำเป็นต้องใช้โฟลเดอร์รายงาน
  • โฟลเดอร์ "การแก้ไข" บางส่วนมีโฟลเดอร์รายงานอยู่แล้ว อย่างไรก็ตามส่วนใหญ่ทำไม่ได้

ฉันต้องเขียนสคริปต์ที่ทำงานทุกวันเพื่อสร้างโฟลเดอร์เหล่านี้สำหรับแต่ละไดเรกทอรี

ฉันสามารถเขียนสคริปต์เพื่อสร้างโฟลเดอร์ได้ แต่การสร้างหลาย ๆ โฟลเดอร์เป็นปัญหา


3
"การสร้างหลายโฟลเดอร์เป็นปัญหา" - คุณมีปัญหาแบบใด คุณไม่แน่ใจวิธีเขียนรหัสหรือไม่ คุณได้รับข้อความแสดงข้อผิดพลาดหรือไม่? โฟลเดอร์ต่าง ๆ ไม่ปรากฏหลังจากรันสคริปต์หรือไม่? ปัญหาที่แตกต่างกันต้องการวิธีแก้ไขที่แตกต่างกัน
LarsH

คำตอบ:


536

ลองใช้-Forceพารามิเตอร์:

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

คุณสามารถใช้Test-Path -PathType Containerเพื่อตรวจสอบก่อน

ดูบทความช่วยเหลือรายการ MSDN ใหม่สำหรับรายละเอียดเพิ่มเติม


101
สำหรับคนขี้เกียจมีชวเลข: md -Force c: \ foo \ bar \ baz
Matthew Fellows

74
สำหรับผู้ที่ไม่ต้องการเอาท์พุทเมื่อสร้างโฟลเดอร์ให้เพิ่ม "| Out-Null" ที่ส่วนท้าย
armannvg

20
- แรงจะทำอะไร? เอกสารกล่าวว่า"กองกำลัง cmdlet นี้ในการสร้างรายการที่เขียนมากกว่ารายการที่อ่านอย่างเดียวที่มีอยู่" มันจะลบโฟลเดอร์ที่มีอยู่หรือไม่ มันควรจะชัดเจนในคำตอบนี้
ปีเตอร์มอร์เทนเซ่น

25
@PeterMortensen ในกรณีของไดเรกทอรีการบังคับให้พวกเขาไม่ได้ล้างเนื้อหาที่มีอยู่ก็ระงับข้อความผิดพลาดที่บอกว่ามันถูกสร้างขึ้นแล้ว คำสั่งนี้จะสร้างโฟลเดอร์ใด ๆ ที่จำเป็นและเนื้อหาของโฟลเดอร์เหล่านั้นก็ปลอดภัยเช่นกันถ้ามีอยู่แล้ว
John Neuhaus

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

Test-Pathตรวจสอบเพื่อดูว่าเส้นทางที่มีอยู่ เมื่อไม่มีมันจะสร้างไดเรกทอรีใหม่


ดี! เงียบนี้ส่งออกถ้าไดเรกทอรีที่มีอยู่แล้ว (เพราะมันใช้test-path)
Chimpanzee

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
อันนี้ไม่ใช่อันที่ง่ายที่สุด แต่เป็นอันที่เข้าใจง่าย
วัง 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 'เป็นเพียงนามแฝงเริ่มต้นของ Powershell สำหรับ` mkdir `(ทำไดเร็กทอรี) คำสั่ง windows คล้ายกับ Linux / Unix mkdir ref: `Get-Alias ​​md '
BentChainRing

4

จากสถานการณ์ของคุณดูเหมือนว่าคุณจำเป็นต้องสร้างโฟลเดอร์ "Revision #" วันละครั้งโดยมีโฟลเดอร์ "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


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.