511 Stimmen

Verzeichnis erstellen, wenn es nicht vorhanden ist

Ich schreibe ein PowerShell-Skript, um mehrere Verzeichnisse zu erstellen, wenn sie nicht vorhanden sind.

Das Dateisystem sieht so aus

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Jeder Projektordner hat mehrere Revisionen.
  • Jeder Revisionsordner benötigt einen Reports-Ordner.
  • Einige der "Revisionen" Ordner enthalten bereits einen Reports-Ordner; jedoch die meisten nicht.

Ich muss ein Skript schreiben, das täglich läuft, um diese Ordner für jedes Verzeichnis zu erstellen.

Ich bin in der Lage, das Skript zu schreiben, um einen Ordner zu erstellen, aber das Erstellen mehrerer Ordner ist problematisch.

13voto

pykimera Punkte 159

Ich hatte genau das gleiche Problem. Du kannst etwas Ähnliches wie dies verwenden:

$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;
    }

    ## Wenn der Pfad bereits existiert
    ## DB Connect
    elseif ((Test-Path $final_local) -eq 1)
    {
        cd $final_local;
        echo $final_local;
        liga;  (Funktion von Ihnen erstellt TODO etwas)
    }
}

11voto

Klark Punkte 7862

Wenn Sie die -Force Flagge angeben, wird PowerShell sich nicht beschweren, wenn der Ordner bereits vorhanden ist.

Einzeiler:

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

Übrigens, für die Planung der Aufgabe, schauen Sie sich bitte diesen Link an: Hintergrundaufgaben planen.

11voto

George Livingston Punkte 2506

Es gibt drei Möglichkeiten, die ich kenne, um ein Verzeichnis mit PowerShell zu erstellen:

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

Hier Bildbeschreibung eingeben

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

Hier Bildbeschreibung eingeben

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

Hier Bildbeschreibung eingeben

4voto

E.V.I.L. Punkte 2032

Aus Ihrer Situation hört es sich so an, als ob Sie einmal am Tag einen "Revision#" -Ordner mit einem "Berichte" -Ordner darin erstellen müssen. Wenn das der Fall ist, müssen Sie nur wissen, was die nächste Überarbeitungsnummer ist. Schreiben Sie eine Funktion, die die nächste Überarbeitungsnummer erhält, Get-NextRevisionNumber. Oder Sie könnten etwas Ähnliches tun:

foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){
    # Wählen Sie alle Überarbeitungsordner aus dem Projektordner aus.
    $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory

    # Die nächste Überarbeitungsnummer ist einfach eins mehr als die höchste Nummer.
    # Sie müssen die Zeichenfolge in der ersten Pipeline in eine Ganzzahl umwandeln, damit Sort-Object funktioniert.
    # Wenn Sie sie absteigend sortieren, wird die erste Nummer die größte sein, sodass Sie diese auswählen.
    # Sobald Sie die höchste Überarbeitungsnummer haben, fügen Sie einfach eins hinzu.
    $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1

    # Jetzt erledigen wir hier zwei Dinge auf einmal.
    # Es erstellt den "Berichte" -Ordner, aber auch den "Revision#" -Ordner.
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory

    # Gehen Sie zum nächsten Projektordner über.
    # Diese nicht getestete Beispiel-Schleife erfordert PowerShell Version 3.0.
}

PowerShell 3.0 Installation.

2voto

Johny Skovdal Punkte 1849

Ich wollte Benutzern ermöglichen, ein Standardprofil für PowerShell zu erstellen, um einige Einstellungen zu überschreiben, und landete schließlich mit dem folgenden Einzeiler (mehrere Anweisungen ja, aber können in PowerShell eingefügt und auf einmal ausgeführt werden, was das Hauptziel war):

cls; [string]$filePath = $profile; [string]$fileContents = '<unsere Standard-Einstellungen>'; if(!(Test-Path $filePath)){md -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; $fileContents | sc $filePath; Write-Host 'Datei erstellt!'; } else { Write-Warning 'Datei existiert bereits!' };

Zur besseren Lesbarkeit würde ich es stattdessen in einer .ps1-Datei machen:

cls; # Konsole leeren, um die Ergebnisse besser zu erkennen
[string]$filePath = $profile; # Als Zeichenfolge deklariert, um die Verwendung von Texten ohne Anführungszeichen zu ermöglichen und dennoch nicht fehlzuschlagen.
[string]$fileContents = '<unsere Standard-Einstellungen>'; # Anweisungen können jetzt auf einzelnen Zeilen geschrieben werden, anstatt durch Semikolons getrennt zu sein.
if(!(Test-Path $filePath)) {
  New-Item -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; # Ausgabe beim Erstellen des Verzeichnisses ignorieren
  $fileContents | Set-Content $filePath; # Erstellt eine neue Datei mit der Eingabe
  Write-Host 'Datei erstellt!';
}
else {
  Write-Warning "Datei existiert bereits! Um die Datei zu löschen, führen Sie den Befehl aus: Remove-Item $filePath";
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X