web-dev-qa-db-ja.com

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

私はいくつかのディレクトリが存在しない場合はそれらを作成するためのPowerShellスクリプトを書いています。

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

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • 各プロジェクトフォルダには複数のリビジョンがあります。
  • 各リビジョンフォルダにはReportsフォルダが必要です。
  • いくつかの "revisions"フォルダはすでにReportsフォルダを含んでいます。しかし、ほとんどはそうではありません。

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

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

258
ecollis6

-Forceパラメータを試しましたか?

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

最初にチェックするために Test-Path -PathType Container を使うことができます。

詳細については、 New-Item MSDNのヘルプ記事を参照してください。

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

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

112
Guest

私はまったく同じ問題を抱えていました。あなたはこのようなものを使うことができます:

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

-Forceフラグを指定した場合、そのフォルダがすでに存在していてもPowerShellは文句を言いません。

ワンライナー:

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

ところで、タスクをスケジュールするためにこのリンクをチェックしてください: バックグラウンドジョブのスケジューリング

9
Klark

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

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

enter image description here

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

enter image description here

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

enter image description here

8

次のコードスニペットは、完全パスを作成するのに役立ちます。

 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"
4
Code Sparrow

あなたの状況から、あなたがそこに "レポート"フォルダと一日一回 "リビジョン#"フォルダを作成する必要があるように聞こえます。その場合は、次のリビジョン番号が何であるかを知る必要があります。次のリビジョン番号を取得する関数を書く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 2 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のインストール

3
E.V.I.L.

私は簡単に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";
};
2
Johny Skovdal

これは私のために働いた簡単なものです。パスが存在するかどうかをチェックし、存在しない場合はルートパスだけでなくすべてのサブディレクトリも作成します。

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
1
tklone
$path = "C:\temp\"

If(!(test-path $path))

{md C:\Temp\}
  • 1行目で$pathという名前の変数を作成し、それに "C:\ temp \"という文字列値を割り当てます。

  • 2行目は、変数$pathが存在しないかどうかを確認するためにTest-Pathコマンドレットに依存するIfステートメントです。存在しないものは!シンボルを使用して修飾されます

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

mdは、入力の短縮形です。New-Item -ItemType Directory -Path $path

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

New-Item -ItemType Directory -Path $path

1
Kyle