511 Stimmen

Erstellen Sie das Verzeichnis, wenn es noch nicht existiert.

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

Das Dateisystem sieht ähnlich aus wie folgt

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • Jedes Projektverzeichnis hat mehrere Revisionen.
  • Jedes Revisionsverzeichnis benötigt ein Reports-Verzeichnis.
  • Einige der "Revisions"-Ordner enthalten bereits ein Reports-Verzeichnis; die meisten jedoch nicht.

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

Ich kann das Skript schreiben, um ein Verzeichnis zu erstellen, aber das Erstellen mehrerer Verzeichnisse ist problematisch.

13voto

pykimera Punkte 159

Ich hatte genau dasselbe 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 Verbindung
    elseif ((Test-Path $final_local) -eq 1)
    {
        cd $final_local;
        echo $final_local;
        liga;  (Funktion von dir erstellt TODO etwas)
    }
}

11voto

Klark Punkte 7862

Wenn Sie die -Force-Flag angeben, wird PowerShell nicht klagen, wenn der Ordner bereits existiert.

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: Hintergrundjobs 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 klingt es so, als ob Sie einmal täglich einen Ordner "Revision#" mit einem Ordner "Reports" darin erstellen müssen. Wenn das der Fall ist, müssen Sie nur wissen, was die nächste Revisionsnummer ist. Schreiben Sie eine Funktion, die die nächste Revisionsnummer abruft, Get-NextRevisionNumber. Oder Sie könnten etwas Ähnliches tun:

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

    # Die nächste Revisionsnummer ist einfach eins mehr als die höchste Nummer.
    # Sie müssen den String in der ersten Pipeline in ein Int umwandeln, damit Sort-Object funktioniert.
    # Wenn Sie es absteigend sortieren, wird die erste Zahl die größte sein, also wählen Sie diese aus.
    # Sobald Sie die höchste Revisionsnummer 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 zwei Aufgaben auf einmal.
    # Es wird den Ordner "Reports" erstellen, aber auch den Ordner "Revision#".
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory

    # Gehe zum nächsten Projektordner über.
    # Diese Beispiel-Schleife wurde nicht getestet und erfordert PowerShell Version 3.0.
}

PowerShell 3.0 Installation.

2voto

Johny Skovdal Punkte 1849

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

cls; [string]$filePath = $profile; [string]$fileContents = ''; 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 hier, wie ich es stattdessen in einer .ps1-Datei machen würde:

cls; # Konsole löschen, um die Ergebnisse besser erkennbar zu machen
[string]$filePath = $profile; # Als String deklariert, um die Verwendung von Texten ohne Bingos zu ermöglichen und dennoch nicht fehlschlagen zu lassen.
[string]$fileContents = ''; # Anweisungen können jetzt auf einzelne Zeilen geschrieben werden, anstatt durch Semikolon 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 dem Eingabewert
  Write-Host 'Datei erstellt!';
}
else {
  Write-Warning "Datei existiert bereits! Um die Datei zu entfernen, 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