ディレクトリが存在しない場合は作成します


341

存在しない場合に複数のディレクトリを作成するPowerShellスクリプトを作成しています。

ファイルシステムはこれに似ています

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • 各プロジェクトフォルダーには複数のリビジョンがあります。
  • 各リビジョンフォルダには、レポートフォルダが必要です。
  • 一部の「revisions」フォルダにはすでにReportsフォルダが含まれています。ただし、ほとんどはそうではありません。

ディレクトリごとにこれらのフォルダを作成するために毎日実行するスクリプトを記述する必要があります。

フォルダを作成するスクリプトを書くことはできますが、複数のフォルダを作成するのは問題があります。


3
「複数のフォルダを作成するのは問題があります」-どのような問題がありますか?タラの書き方がわかりませんか?エラーメッセージが表示されますか?スクリプトの実行後、フォルダーが表示されませんか?異なる問題には異なる解決策が必要です。
LarsH

回答:


535

-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は実際には何をしますか?ドキュメントには、「このコマンドレットが既存の読み取り専用アイテムを上書きするアイテムを作成するよう強制する」と記載されています。既存のフォルダを削除しますか?この答えははっきりしているはずです。
Peter Mortensen、

25
@PeterMortensenディレクトリの場合、ディレクトリを強制しても既存のコンテンツは消去されず、すでに作成されているというエラーメッセージが表示されなくなります。このコマンドは、必要な介在フォルダーも作成します。それらのフォルダーの内容が既に存在する場合も、それらの内容は安全です。
John Neuhaus

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

Test-Pathパスが存在するかどうかを確認します。そうでない場合は、新しいディレクトリを作成します。


いいね!(を使用しているためtest-path)ディレクトリがすでに存在する場合は、出力が停止されます。
好戦的なチンパンジー、

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

上記の関数は、関数に渡したパスを分割し、各フォルダーが存在するかどうかを確認します。存在しない場合は、target / finalフォルダーが作成されるまで、それぞれのフォルダーが作成されます。

関数を呼び出すには、以下のステートメントを使用します。

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

ところで、タスクのスケジュールについては、次のリンクを確認してください:バックグラウンドジョブのスケジュール


10

使用する:

$path = "C:\temp\"

If (!(test-path $path))
{
    md C:\Temp\
}
  • 1行目は、という名前の変数を作成し、$pathそれに「C:\ temp \」の文字列値を割り当てます

  • 2行目はIfTest-Pathコマンドレットを使用して変数$pathが存在しないかどうかを確認するステートメントです。存在しないは、!記号を使用して修飾されます。

  • 3行目:上記の文字列に格納されているパスが見つからない場合は、中括弧の間のコードが実行されます。

md 入力の短いバージョンです: New-Item -ItemType Directory -Path $path

注:-Force以下のパラメーターを使用して、パスが既に存在する場合に望ましくない動作がないかどうかを確認するためのテストは行っていません。

New-Item -ItemType Directory -Path $path

1
これは、ディレクトリの階層に対しても機能し、md "C:\first\second\thirdすべてを作成します。
MortenB

9

PowerShellを使用してディレクトリを作成する方法は3つあります。

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`(ディレクトリの作成)のPowershellデフォルトエイリアスにすぎないことに注意してください。ref: `Get-Alias
md`

4

あなたの状況から、そこに「レポート」フォルダを含む「Revision#」フォルダを1日に1回作成する必要があるようです。その場合は、次のリビジョン番号を知る必要があります。次のリビジョン番号を取得する関数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のデフォルトプロファイルを簡単に作成して一部の設定を上書きできるようにしたいと思ったので、次の1行になりました(複数のステートメントがあり、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.