Créer le répertoire s'il n'existe pas

j'écris un script PowerShell pour créer plusieurs répertoires s'ils n'existent pas.

le système de fichiers ressemble à ce

D:
D:TopDirecSubDirecProject1Revision1Reports
D:TopDirecSubDirecProject2Revision1
D:TopDirecSubDirecProject3Revision1
  • chaque dossier de projet a plusieurs révisions.
  • chaque dossier de révision a besoin d'un dossier de rapports.
  • certains dossiers" révisions " contiennent déjà un dossier Rapports, mais la plupart ne le contiennent pas.

j'ai besoin pour écrire un script qui tourne quotidiennement pour créer ces dossiers pour chaque répertoire.

je suis capable d'écrire le script pour créer un dossier, mais créer plusieurs dossiers est problématique.

217
demandé sur SteveC 2013-06-04 01:30:26

10 réponses

avez-vous essayé le paramètre -Force ?

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

vous pouvez utiliser Test-Path -PathType Container pour vérifier en premier.

voir le nouvel article article d'aide du MSDN pour plus de détails.

368
répondu Andy Arismendi 2017-12-14 10:06:05
$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
      New-Item -ItemType Directory -Force -Path $path
}

Test-Path vérifie si le chemin existe. Quand il n'est pas, il va créer un nouveau répertoire.

82
répondu Guest 2018-01-11 09:51:23

j'ai eu exactement le même problème. Vous pouvez utiliser quelque chose comme ceci:

$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)
    }
}
12
répondu pykimera 2017-05-28 22:36:29

il y a 3 façons de créer un répertoire en utilisant PowerShell

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

7
répondu George Livingston 2016-10-26 10:58:37

lorsque vous spécifiez le drapeau -Force , PowerShell ne se plaindra pas si le dossier existe déjà.

One-liner:

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

BTW, pour programmer la tâche s'il vous plaît consulter ce lien: programmer des travaux de fond .

7
répondu Klark 2017-05-28 22:37:11

l'extrait de code suivant vous aide à créer le chemin complet.

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

au-dessus de la fonction divise le chemin que vous avez passé à la fonction, et vérifiera chaque dossier s'il a existé ou non. Si elle n'existe pas, elle créera le dossier respectif jusqu'à ce que le dossier cible/final soit créé.

pour appeler la fonction, utilisez la déclaration suivante:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"
4
répondu Code Sparrow 2017-11-07 07:21:52

de votre situation est des sons comme vous avez besoin de créer un dossier" Révision# "une fois par jour avec un dossier" Rapports " là-dedans. Si c'est le cas, vous avez juste besoin de savoir quel est le prochain numéro de révision. Écrivez une fonction qui obtient le prochain numéro de révision Get-NextRevisionNumber. Ou vous pourriez faire quelque chose comme ceci:

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 installation

2
répondu Mad Tom Vane 2013-06-03 22:12:21

je voulais être capable de laisser les utilisateurs créer facilement un profil par défaut pour PowerShell pour outrepasser certains réglages, et j'ai fini avec la doublure suivante (déclarations multiples Oui, mais peut être collé dans PowerShell et exécuté en même temps, ce qui était le but principal):

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

pour plus de lisibilité, voici comment je le ferais dans un fichier ps1 à la place:

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
répondu Johny Skovdal 2017-05-28 22:35:41

en Voilà un simple qui a marché pour moi. Il vérifie si le chemin existe, et s'il n'existe pas, il crée non seulement le chemin racine, mais aussi tous les sous-répertoires:

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
1
répondu tklone 2017-09-18 13:35:50
$path = "C:\temp\"

If(!(test-path $path))

{md C:\Temp\}
  • la première ligne crée une variable appelée $path et lui attribue la valeur de chaîne de "C:\temp\ "

  • Deuxième ligne If déclaration qui s'appuie sur Test-Chemin de l'applet de commande pour vérifier si la variable $path n'existe PAS. Le non existe est qualifié en utilisant le symbole !

  • troisième ligne: si le chemin stocké dans la chaîne ci-dessus N'est pas trouvé, le code entre les crochets bouclés sera exécuté

md est la version courte de Dactylographie: New-Item -ItemType Directory -Path $path

Note: je n'ai pas testé le paramètre -Force avec le paramètre ci-dessous pour voir s'il y a un comportement indésirable si le chemin existe déjà.

New-Item -ItemType Directory -Path $path

1
répondu Kyle 2017-10-12 17:07:19