[PowerShell] String aus Variable in neuer Zeile anhängen.

Kiso

Lieutenant
Registriert
Feb. 2012
Beiträge
557
Guten Tag,

ich möchte bei diesem Stück Code die Ausgabe etwas aufhübschen. In $created ist ein Ordnerpfad als String geladen.
Die Ausgabe ergibt allerdings, dass alle Pfade hintereinander ausgegeben werden.

Code:
foreach{$line in $inventory}{
$all_created=$all_created+=$created 
}

Write-Host "Erstellt wurden:"
Write-Host $all_created

Ich möchte diese allerdings untereinander ausgeben. Sprich $created in einer neuen Zeile anhängen.

Hat da bitte jemand einen Tipp für mich?

Grüße
 
Das ist total wirr, was soll das foreach da? $all_created und $created hängen doch nicht an $line bzw. inventory?
$all_created=$all_created+=$created schreibt man als $all_created+=$created.

Gib mal mehr Kontext zum Code, dann kann man den auch sinnvoll aufhübschen. Ansonsten musst du halt Linebreaks an $created dranhängen.
 
Code:
`n
Das ` ist das Escapezeichen wie \ z.B. in C und das n steht für Newline, also neue Zeile.

Also auf dein Beispiel angewendet:
Code:
$all_created=$all_created+"`n$created"
oder besser lesbar:
Code:
$all_created = $all_created + "`n" + $created

Wofür hast du das += in der Verknüpfung?
Wenn du das nutzen willst wäre folgendes richtig:
Code:
$all_created+="`n$created"

//edit:
Und der Vorposter hat Recht. $created wird in der Schleife nicht angefasst. Willst du vielleicht mit $line arbeiten?
 
Zuletzt bearbeitet:
Code:
#Eingaben
$path = "C:\users\User\test\"
$domain="domain.local"

#Ordnerinhalt erfassen 
$inventory = Get-ChildItem -path $path
$all_created = "" #Variable leeren


foreach($line in $inventory){ #Vielleicht noch Filetype Directory angeben
    if($line.name -notlike "*.v2") 
    {    
        $fullpath=$path+$line.name+".v2"        #Für jeden Ordner schauen, ob es einen .v2 gibt
        $check= Test-Path $fullpath        
            
            if($check -eq $false){ 
            
            #Ordnername = Username in SID umwandeln
            $SAMAccountName=$line.name
            $account = New-Object System.Security.Principal.NTAccount($domain,$SAMAccountName)
            #$script:ErrorActionPreference = "silentlyContinue"
            $accountSid = $account.Translate([System.Security.Principal.SecurityIdentifier])          #Translatefehler ignorieren?
            #$script:ErrorActionPreference = "stop"

            #Ordner erstellen
            New-Item -ItemType Directory -Path $path$line.v2 -OutVariable created
            
            #Besitzer ändern und Rechtevererbung deaktivieren.
            $acl = Get-Acl $created         
            $acl.SetOwner($accountSid)                    
            $acl.SetAccessRuleProtection($true,$true)
            
                
            Set-Acl -Path $created -AclObject $acl                         
            $all_created=$all_created+"`n"+$created                        
            }
        }
    }
    #Ausgabe
    Write-Host "Erstellt wurden:"
    Write-Host $all_created

Ich bin noch Anfänger mit PowerShell. Ich bin mir bei einigen Sachen, etwa der Benennung von Variablen, manchmal noch nicht so sicher. Vielleicht habt ihr noch ein paar Verbesserungsvorschläge. Das Skript funktioniert soweit gut.
 
Zuletzt bearbeitet:
Ich würde folgende Sachen ändern:

$all_created = $NULL ( schneller als einen leeren String zuzuweisen)

Zeile 14 + 16 -->

if(-not (Test-Path $fullpath )){



mit dem windows spezifischen kram kenne ich mich da nicht so gut aus, dazu müssten andere was sagen
 
Hier mal ungetestet auf die Schnelle ein paar Verbesserungen. Änderungenen sind im Code als Kommentar beschrieben.
Die ganzen Catch-Error-Teile könnte man natürlich noch in Skript-Blöcke packen.

Code:
#Eingaben     
$path = 'C:\users\User\test\' # DPXone: ich bevorzuge immer einfache Hochkommas ('), solange man nicht innerhalb des String irgendwelche Variablen auflösen möchte     
$domain = 'domain.local' # DPXone: ich bevorzuge immer einfache Hochkommas ('), solange man nicht innerhalb des String irgendwelche Variablen auflösen möchte     

#Ordnerinhalt erfassen      
$inventory = Get-ChildItem -path $path -Directory #DPXone: Filter auf Directory     
$all_created = @() #DPXone: Array deklarieren     


Foreach ($line In $inventory) { #Vielleicht noch Filetype Directory angeben  | DPXone: Filter ist bereits auf $inventory gesetzt     
	If ($line.name -notlike '*.v2') # DPXone: ich bevorzuge immer einfache Hochkommas ('), solange man nicht innerhalb des String irgendwelche Variablen auflösen möchte     
	{ 
		$fullpath = join-path -Path $path -ChildPath "$($line.name).v2" #DPXone: eine bessere Lösung, wenn es um Erstellungen von Pfaden geht (fügt nämlich auch eventuell fehlende Backslashes (\) ein
# zudem kommen hier Anführungszeichen zum Einsatz + $()  ... hab die Bezeichnug hierfür vergessen, aber dadurch wird $line.name aufgelöst    
		
		If (-not(Test-path $fullpath)) { #DPXone: Spart Zeilen     
			
			#Ordnername = Username in SID umwandeln     
			$SAMAccountName = $line.name 
			
			Try { #DPXone: Try/Catch. Falls Fehler auftreten werden Fehler in der Konsole angezeigt  
				$account = New-Object System.Security.Principal.NTAccount($domain , $SAMAccountName) 
				
				Try { #DPXone: Try/Catch. Falls Fehler auftreten werden Fehler in der Konsole angezeigt 
					$accountSid = $account.Translate([System.Security.Principal.SecurityIdentifier]) 
					
					#Ordner erstellen     
					New-Item -ItemType Directory -Path $path$line.v2 -OutVariable created 
					
					
					#Besitzer ändern und Rechtevererbung deaktivieren.    
					Try { #DPXone: Try/Catch. Falls Fehler auftreten werden Fehler in der Konsole angezeigt 
						$acl = Get-Acl $created 
						$acl.SetOwner($accountSid) 
						$acl.SetAccessRuleProtection($true , $true) 
						
						Set-Acl -Path $created -AclObject $acl 
						$all_created += $created   # DPXone: Durch die Deklaration als Array oben können nun einfach durch += Werte zur Variable hinzugefügt werden
						
					} Catch { 
						write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red 
						write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red 
					} 
					
				} Catch { 
					write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red 
					write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red 
				} 
				
			} Catch { 
				write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red 
				write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red 
			} 
			
		} 
	} 
} 
#Ausgabe     
Write-Host 'Erstellt wurden:' # DPXone: ich bevorzuge immer einfache Hochkommas ('), solange man nicht innerhalb des String irgendwelche Variablen auflösen möchte    
Write-Host $all_created | Format-List *
 
Zuletzt bearbeitet:
Wenn man die beiden Abfragen fuer $line.name *.v2 und $fullpath umkehrt und den aktuellen Durchlauf mit continue vorzeitig abbricht spart man sich das Klammern gewurschtel. Ebenso kann man bei den moeglichen Fehlern direkt zum naechsten Element springen.

Modifizierte ungetestete Version basierend auf DPXone's ebenfalls ungetesteten Version :D
Code:
#Eingaben
$path = 'C:\users\User\test\\'
$domain = 'domain.local'

#Ordnerinhalt erfassen
$inventory = Get-ChildItem -path $path -Directory
$all_created = @()

Foreach ($line In $inventory) {
    If ($line.name -like '*.v2') {
        continue
    }

    $fullpath = join-path -Path $path -ChildPath "$($line.name).v2"

    If (Test-path $fullpath) {
        continue
    }
    $account = $null
    $accountSid = $null

    Try {
        $account = New-Object System.Security.Principal.NTAccount($domain , $line.name)
    } Catch {
        write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red
        write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red
        continue
    }

    Try {
        $accountSid = $account.Translate([System.Security.Principal.SecurityIdentifier])
        #Ordner erstellen
        New-Item -ItemType Directory -Path $path$line.v2 -OutVariable created
    } Catch {
        write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red
        write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red
        continue
    }

    #Besitzer ändern und Rechtevererbung deaktivieren.
    Try {
        $acl = Get-Acl $created
        $acl.SetOwner($accountSid)
        $acl.SetAccessRuleProtection($true , $true)

        Set-Acl -Path $created -AclObject $acl
        $all_created += $created
    } Catch {
        write-host($_.Exception | Format-List -Force | out-string) -ForegroundColor red
        write-host($_.toString() | Format-List -Force | out-string) -ForegroundColor red
        continue
    }
}

#Ausgabe
Write-Host 'Erstellt wurden:'
Write-Host $all_created | Format-List *
 
Zurück
Oben