Tạo thư mục nếu nó không tồn tại


341

Tôi đang viết một tập lệnh PowerShell để tạo một số thư mục nếu chúng không tồn tại.

Hệ thống tập tin trông tương tự như thế này

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Mỗi thư mục dự án có nhiều phiên bản.
  • Mỗi thư mục sửa đổi cần một thư mục Báo cáo.
  • Một số thư mục "sửa đổi" đã chứa thư mục Báo cáo; tuy nhiên, hầu hết không.

Tôi cần phải viết một kịch bản chạy hàng ngày để tạo các thư mục này cho mỗi thư mục.

Tôi có thể viết tập lệnh để tạo thư mục, nhưng việc tạo một số thư mục có vấn đề.


3
"Tạo một số thư mục có vấn đề" - bạn đang gặp phải vấn đề gì? Bạn không chắc chắn làm thế nào để viết cá tuyết? Bạn nhận được một thông báo lỗi? Các thư mục chỉ không xuất hiện sau khi tập lệnh được chạy? Các vấn đề khác nhau đòi hỏi các giải pháp khác nhau.
LarsH

Câu trả lời:


535

Hãy thử -Forcetham số:

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

Bạn có thể sử dụng Test-Path -PathType Containerđể kiểm tra đầu tiên.

Xem New-mục bài viết MSDN giúp đỡ để biết thêm chi tiết.


101
Đối với những người lười biếng, có một tốc ký: md -Force c: \ foo \ bar \ baz
Matthew Fellows

74
Đối với những người không muốn bất kỳ đầu ra nào khi thư mục được tạo, hãy thêm "| Out-Null" vào cuối
armannvg

20
Điều gì sẽ -Force thực sự làm gì? Tài liệu nói rằng "Buộc cmdlet này tạo ra một mục ghi trên một mục chỉ đọc hiện có" . Nó sẽ xóa một thư mục hiện có? Nó nên rõ ràng trong câu trả lời này.
Peter Mortensen

25
@PeterMortensen Trong trường hợp thư mục, buộc chúng không xóa nội dung hiện có, nó chỉ chặn thông báo lỗi cho biết nó đã được tạo. Lệnh này cũng sẽ tạo ra bất kỳ thư mục can thiệp nào cần thiết và nội dung của các thư mục đó cũng an toàn nếu chúng đã tồn tại.
John Neuhaus

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

Test-Pathkiểm tra xem đường dẫn có tồn tại không Khi không, nó sẽ tạo một thư mục mới.


Đẹp! Điều này im lặng đầu ra nếu thư mục đã tồn tại (bởi vì nó sử dụng test-path).
Tinh tinh hiếu chiến

17

Đoạn mã sau giúp bạn tạo một đường dẫn hoàn chỉnh.

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"
        }
    }
}

Hàm trên chia đường dẫn bạn chuyển đến hàm và sẽ kiểm tra từng thư mục xem nó có tồn tại hay không. Nếu nó không tồn tại, nó sẽ tạo thư mục tương ứng cho đến khi thư mục đích / cuối cùng được tạo.

Để gọi hàm, sử dụng câu lệnh dưới đây:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"

1
Đây không phải là một trong những dễ dàng nhất, nhưng là một dễ hiểu.
Wang Jijun

giải pháp tốt đẹp! cảm ơn;)
Alberto S.

13

Tôi cũng có chính xác vấn đề đấy. Bạn có thể sử dụng một cái gì đó như thế này:

$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

Khi bạn chỉ định -Forcecờ, PowerShell sẽ không khiếu nại nếu thư mục đã tồn tại.

Lót:

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

BTW, để lập lịch tác vụ, vui lòng kiểm tra liên kết này: Lập lịch công việc nền .


10

Sử dụng:

$path = "C:\temp\"

If (!(test-path $path))
{
    md C:\Temp\
}
  • Dòng đầu tiên tạo một biến có tên $pathvà gán cho nó giá trị chuỗi của "C: \ temp \"

  • Dòng thứ hai là một Ifcâu lệnh dựa trên lệnh ghép ngắn Test-Path để kiểm tra xem biến $pathđó có tồn tại không . Không tồn tại là đủ điều kiện bằng cách sử dụng !biểu tượng.

  • Dòng thứ ba: Nếu không tìm thấy đường dẫn được lưu trữ trong chuỗi ở trên , mã giữa các dấu ngoặc nhọn sẽ được chạy.

md là phiên bản ngắn của việc gõ ra: New-Item -ItemType Directory -Path $path

Lưu ý: Tôi chưa thử nghiệm bằng cách sử dụng -Forcetham số với bên dưới để xem liệu có hành vi không mong muốn nếu đường dẫn đã tồn tại.

New-Item -ItemType Directory -Path $path

1
điều này cũng hoạt động cho một hệ thống phân cấp của các thư mục md "C:\first\second\thirdtạo ra tất cả.
MortenB

9

Có ba cách tôi biết để tạo thư mục bằng PowerShell:

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

Nhập mô tả hình ảnh ở đây

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

Nhập mô tả hình ảnh ở đây

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

Nhập mô tả hình ảnh ở đây


Lưu ý rằng `md` chỉ đơn giản là một bí danh mặc định của Powershell cho` mkdir` (tạo thư mục), một lệnh windows tương tự như mkdir của Linux / Unix. ref: `Get-Alias
md`

4

Từ tình huống của bạn, có vẻ như bạn cần tạo thư mục "Revision #" mỗi ngày một lần với thư mục "Báo cáo" trong đó. Nếu đó là trường hợp, bạn chỉ cần biết số sửa đổi tiếp theo là gì. Viết hàm lấy số sửa đổi tiếp theo, Get-NextRevisionNumber. Hoặc bạn có thể làm một cái gì đó như thế này:

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.
}

Cài đặt PowerShell 3.0 .


2

Tôi muốn có thể dễ dàng cho phép người dùng tạo hồ sơ mặc định cho PowerShell để ghi đè một số cài đặt và kết thúc bằng một lớp lót sau (nhiều câu lệnh có, nhưng có thể được dán vào PowerShell và thực hiện cùng một lúc, đó là mục tiêu chính ):

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!' };

Để dễ đọc, đây là cách tôi sẽ làm trong tệp .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

Đây là một cái đơn giản làm việc cho tôi. Nó kiểm tra xem đường dẫn có tồn tại hay không và nếu không, nó sẽ tạo ra không chỉ đường dẫn gốc mà tất cả các thư mục con cũng:

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.