Jump to content

italianstallion

Members
  • Gesamte Inhalte

    75
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von italianstallion

  1. Hi,

     

    mal weider krankes Vorhaben meinerseits...wie fange ich an?

     

    Mit import-csv lese ich sehr viele CSVs ein, die immer so aussehen:

    Name;Pfad;Pfad

    Wobei mich immer nur der Name und der erste Pfad interessiert.

     

    Mein Versuch:

    $names = $null
    $namespath = $null
    $hash1 = @{}
    
    foreach ($line in $lines)
        {
            $names += import-csv $path\$txtline\asdf.txt -delimiter ";" -header name,path1,path2 | select name
            $namepath += import-csv $path\$txtline\asdf.txt -delimiter ";" -header name,path1,path2 | select path1
            $hash1 += @{$names=$namepath}
        }
    

    Lacht mich nicht aus, aber ich habe heute das erste Mal von Hashtables gehört ;)

     

    Weitere Fakten:

    - Import-csv würde ich gern verwenden, weil den Header hinzufügen kann, den gibt es in den gelieferten CSVs nämlich leider nicht

    - Die foreach arbeitet ein vorangestelltes "get-Childitem" ab, denn in in $path + dem Ergebnis von get-Childitem liegt immer eine asdf.txt, die ich alle einlesen muss

    - Einen, denke ich muss ich verwenden, weil ich später noch weitere Informationen aus komplett anderen Quellen hinzufügen muss um dann am Schluss alles Zusammen in eine CSV mit komplett anderer Struktur auszugeben

     

    Danke und Grüße

  2. Hi,

     

    habe mir in meinem Skript aus allen Möglichen Quellen Informationen zusammengesammelt und in Variablen geschrieben.

    Dazu gehören unter anderem:

    Datum, anzahl Dateien,größe all dieser Dateien usw.

     

    Die Ergebnisse sollen nun in eine csv...also - denk ich mir - nutze ich export-csv

     

    Aaaaaaaaaaber: Das Cmdlet is n Krampf!

     

    Es schreibt seltsame Dinge in die csv, anstatt die eigentlichen Werte.

    Einen Hinweis auf mein Problem hab ich hier gefunden, verstehe aber nur Bahnhof:

    http://stackoverflow.com/questions/21047185/how-to-export-data-to-csv-in-powershell

     

    Er erzeugt vorher ein Objekt?!

     

    Check ich nich...ihr? ;)

     

    Eins noch: Beim zählen und Größe berechnen bekomme ich PFad zu lang Fehler.

    Kann ich das Umgehen? Wie komme ich trotzdem an die Infos für die Dateien, die in zu langen Pfaden liegen?

    Meldung:

    "get-childitem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name
    must be less than 248 characters."

     

    Grüße

     

  3. Hallo Powershell Freunde,

     

    heute möchte ich alle Textdateien in einem Pfad zählen und die Größe ermitteln.

    Mein Ansatz zählen:

    (get-childitem $pfad *.txt).count
    

    Funktioniert wie ich möchte.

     

    Die Größe ermitteln

    get-childitem "$pfad *.txt | Measure-Object -Property length -sum | Select-Object sum
    

    funktioniert auch, aber ich hätte gern GB angezeigt.

     

    Problem:

    /1GB

    funktioniert nicht.

     

    Habe versucht obiges Ergebnis in eine Variable des Typs [int] zu schreiben. Geht aber nicht, weil

     

    "Cannot convert value "@{Sum=228259984}" to type "System.Int32". Error: "Cannot convert the "@{Sum=228259984}" value of type"

     

    Kann ich die Ausgabe von select-object so umbiegen, dass ein int rauskommt mit dem ich rechnen kann?

     

    Danke und Grüße

  4. Hi,

     

    Den hostnamen habe ich dann wenn ich ein get-childitem mache und mir die Dateinamen einlese, sonst nicht, da sie variabel sind.

    Ich habe mir allerdings überlegt, dass ich vielleicht lieber die out-files zähle und die rdy-files zähle und mit -eq vergleiche.

     

    Jetzt stoße ich grade an ein anderes Problem:

    get-childitem $outpath *.out | select Name
    

    Gibt mir ja alle Namen zurück.

    Wenn ich nun ein

    get-content -path $outpath\$line | Out-File -FilePath $finalout -append
    

    mache, bekomme ich folgenden Fehler ($outpath habe ich natürlich vorher definiert und der Pfad stimmt)

    get-content : Cannot find path '\\mydomain.de\dfs\bla\bla\SCRIPTS\bla\POOL\bla\@{Name=asdf.out}' because it does not exist.

    Ist das @{Name=} mein Problem?

    Wenn ja: Wo kommt das her?

    Der Pfad an sich stimmt und die Dateien liegen dort auch drin...das einzige was nicht stimmt ist das @{Name=}

     

    Danke und Grüße


    Ist bissel unübersichtlich...hier die ganze Schleife:

    if($outcount -eq $rdycount){
        $allouts = get-childitem $outpath *.out | select Name
        foreach ($line in $allouts){
            get-content -path $outpath\$line | Out-File -FilePath $finalout -append
        }
    }
    

    Jetzt ist vielleicht klar wo $line herkommt... ;)

     

    Grüße


    Ups...bin mir nicht sicher warum, aber so gehts:

    if($outcount -eq $rdycount){
        $allouts = get-childitem "$outpath" *.out -name 
        foreach ($line in $allouts){
            get-content -path $outpath\$line | Out-File -FilePath $finalout -append
        }
    }
    

    Get-Childitem -name anstatt | select name

     

    Danke ertsmal an alle!

  5. Hi Leute,

     

    Spezialauftrag: Ich muss in einem PS Skript unter anderem folgendes tun...an diesem Teil scheitere ich gerade:

     

    - Zig Maschinen schreiben jeder jeweils zwei Dateien in ein Pool Verzeichnis

    hostname.out

    hostname.rdy

     

    - Nun kommt mein Skript und soll nachsehen ob immer die Datei-Pärchen da sind

     

    Falls ja: Eine Subroutine starten

    Falls nein: Nichts tun

     

    Versucht habe ich es mich mit "get-childitem"...das ist - glaube ich - auch richtig, aber das vergleichen ohne zu wissen was genau drin stehen könnte?

    Es können nämlich Maschinen hinzukommen und wegfallen...deshalb das get-childitem.

     

    Ideen?

     

    Danke und Grüße

  6. probiers doch mal mit einer Globalcatalogabfrage gegen einen DC deiner Domäne:

    -server myDC:3268

     

    blub

     

    Hi,

     

    interessant...der Port fragt explizit den GC?

     

    Ich habe immer versucht -server mydomain.de um immer einen gültigen DC zu bekommen, falls sich die DCs ändern.

     

    Hab jetzt bei anderen Skripten immer wieder die Selben Fehler bekommen.

     

    Hab heute mal folgendes getestet:

    - Erst mit nslookup mydomain.de alle DCs rausgfunden

    - Dann mit - server alle einzeln versucht

    -> Jetzt tun manche und manche nicht

     

    Laut AD Sites and Services sind jedoch alle DCs GCs...sprich: Daran kanns nicht liegen, oder?

     

    Grüße

  7. Hi Dukel,

     

    meine Rückmeldung hat ein wenig gedauert, sorry.

     

    1. Habs mit import und export-csv gelöst...und rockt jetzt richtig! Danke für den Tip!

    2. Es waren Fehler wie dieser hier:

    The server was unable to process the request due 
    to an internal error.  For more information about the error, either turn on 
    IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from 
    the <serviceDebug> configuration behavior) on the server in order to send 
    the exception information back to the client, or turn on tracing as per the 
    Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace 
    logs.get-aduser : The server was unable to process the request due to an 
    internal error.  For more information about the error, either turn on 
    IncludeExceptionDetailInFaults (eitherfrom ServiceBehaviorAttribute or from 
    the <serviceDebug> configuration behavior) on the server in order to send 
    the exception information back to the client, or turn on tracingas per the 
    Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace 
    logs.At line:1 char:1+ get-aduser italianstallion+ 
    ~~~~~~~~~~~~~~~~~~    + 
    CategoryInfo          : 
    NotSpecified: (italianstallion:ADUser) [Get-ADUser], 
    ADException    + FullyQualifiedErrorId : The server was 
    unable to process the request due to an internal error.  For more 
    information about the error, either turn on 
    IncludeExceptionDetailI   nFaults (either from 
    ServiceBehaviorAttribute or from the <serviceDebug> configuration 
    behavior) on the server in order to send the exception information back to the 
    client,  or turn on tracing as per the Microsoft .NET Framework 3.0 SDK 
    documentation and inspect the server trace 
    logs.,Microsoft.ActiveDirectory.Management.Commands.GetADUser

    Oder auch nur ein "Internal oder local error ocurred" ...Problem ist: Es ist eine Multidomainumgebung und ich bin hier kein Domainadmin und keine Rechte.

    Wenn ich mit dem Parameter "-Server" spiele und andere Subdomains angebe geht es teilweise...ich kann aber nicht erkennen woran genau es liegt.

    Spätestens bei der Übergabe der Ergebnisse an "| get-adgroup" hing sich die Powershell aber immer auf ohne Fehlermeldung und ich musste den Prozess killen.

     

    Danke und Grüße

  8. Hallo Leute,

     

    Heute folgendes Problem:

    Ich erstelle mit csvde eine Output Datei über alle User im AD mit einigen Attributen, die wichtig sind für diese Aktion.

     

    Problem ist: Der DN soll nicht drin sein, csvde baut ihn aber ein und ich bekomm ihn nicht raus.

     

    Da ich das csvde aus einem Powershell Sktipt starte, dachte ich: Warum nicht gleich damit den DN entfernen...

     

    Ausgabe ist folgende nur auf drei Zeilen gekürzt:

    DN,sn,givenName,department,sAMAccountName,telephoneNumber,mail,employeeID
    "OU=_USER,OU=test-ou,DC=my,DC=domain,DC=com",Nachname,Vorname,Abteilung,samacc,0123456,vorname.nachname@my.domain.com,personalnummer"OU=_USER,OU=test-ou,DC=my,DC=domain,DC=com",Mustermann,Max,GL,samacc,6543210,max.mustermann@my.domain.com,99999

    Nu soll der DN raus...ich dachte mir ich trenne auf ", (Hochkomma und Komma) da eindeutig in jeder Zeile.

    Also:

    ForEach ( $line in $output) {    ($dn,$rest) = 
    $line.Split("'",'")    write "dn= $dn"    
    write "rest= $rest"    }

    Habe versucht ", mit allen Mitteln zu maskieren...die Ausgabe ist aber immer Schrott.
    Meist ist "dn=" leer und "rest=" enthält die gesamte Zeile ohne " oder ,

    Ist split vllt gar nicht angebracht an dieser Stelle?

     

    Bin für jede Hilfe dankbar!

     

    Stallion

     

  9. Freunde! Ihr seid großartig!

     

    Da ich den Output mit ForFilesn icht hinbekommen hab, hab ichs mit den letzten Posts doch mit Powershell versucht und tatataaaaa...es läuft und tut was es soll!

    Inklusive sehr geilem Log!

     

    Musste nur ein -encoding ans out-file hängen!

    $datum = Get-Date -Format 'yyyyMMdd_HHmm'
    $logdatum = Get-Date -Format 'yyyy-MM-dd - HH:mm:ss'
    $log = "D:\SKRIPTE\LOGS\alte_daten_aufraeumen_$datum-$env:computername.log"
    $cfg = "D:\SKRIPTE\alte_daten_aufraeumen.cfg"
    
    write-LOG  "Startzeit:                              $logdatum"
    write-LOG
    write-LOG  "Config:                                 $cfg"
    Import-Csv $cfg -delimiter ';' | ForEach-Object {
    
    $pfad = $_.pfad
    $dateistring = $_.dateistring
    $alter = $_.alter
    
    write-LOG "Zu durchsuchender Pfad:                  $pfad"
    write-LOG "Zu suchende Dateistrings:                $dateistring"
    write-LOG "Dateien löschen, die älter sind als:     $alter"
    Get-ChildItem $pfad -recurse $dateistring -force | where {$_.lastwritetime -lt (get-date).AddDays($alter)} | Remove-Item -Force -verbose 4>&1 | Out-File $log -encoding UTF8 -append
    }
    
    write-LOG
    write-LOG  "Endzeit:                                $logdatum"
    
    ###############################################################################
    # Subroutinen
    # Sub Ausgabe in Logdatei
    Function write-LOG {
       Param ([string]$logstring)
    
       Add-content $log -value $logstring
    }
    ###############################################################################
    

    Jetzt wäre es noch wichtig Systemvariablen wie %TMP%  in der Config verwenden zu können...das wird aber schwierig, oder?

     

    Das import-csv liest den String %TMP% nämlich als Text ein...ich müsste die CSV erst nach %***% durchsuchen und dann umsetzen á la

    $out3 = [System.Environment]::ExpandEnvironmentVariables("$line")

     

    Oder gibts nen einfacheren Tip?

     

    Für den Anfang auf jedenfall: SEHR SEHR GEIL! :jau: 

     

    Danke an alle!

    • Like 1
  10. 1. Natürlich Perl, nicht Pearl :p

    2. Werde ich gleich noch testen

    3. Das Alter negativ is klar

    3. Never ever...der Perl-Mann soll in Rente gehn! :D - Keine Sorge, er steht neben mir und liest mit! :D

     

    Grüße


    Naja...so funktionierts erstmal:

    $datum = Get-Date -Format 'yyyyMMdd_HHmm'
    $log = "D:\SKRIPTE\LOGS\alte_daten_aufraeumen_$datum-$env:computername.log"
     
    Import-Csv 'D:\SKRIPTE\alte_daten_aufraeumen.cfg' -delimiter ';' | 
    
    ForEach-Object {       
    	$_.pfad
    	$_.dateistring
    	$_.alter
     
    	forfiles /P $($_.pfad) /s /m $($_.dateistring) /d -$($_.alter) /c “cmd /c del @file”
    }

    Ihr werdet mich vermutlich rügen, weil ichs nu doch mit forfiles gelöst hab, denn: Tataaaaaaaa...jetzt kann ich lein Log schreiben! :D

     

    Verdammt...mein Log bleibt leer wenn ich ein ">> $log 2>&1" anhänge egal ob ich es ins “cmd /c del @file” reinpacke oder dahinter schreibe...

     

    Grüße und eine schönes Wochenende!

  11. Kinners...ich krich n Vogel gleich!

     

    Habs mit PS Mittel versucht...seit Stunden übrigens :confused:

     

    Mein Problem ist, dass

    Get-ChildItem $_.pfad -recurse $_.dateistring -force | where {$_.lastwritetime -lt (get-date).AddDays($_.alter)} | Remove-Item -Force 

    ...immer alles löscht anstatt nur alles älter als $_.alter

     

    - In der ISE mit nem Breakpoint und Ausgabe der Variablen konnte ich sehen, dass alle drei Variablen korrekt geüllt sind

    - Der o.g. Befehl allein funktioniert auch ohne Variablen

     

    -> Ich denke mein Problem ist, dass $_.lastwritetime leer ist...aber warum?!

     

    Und weiter: Ich bekomm keinerlei Output aus der o.g. Zeile! Ist das normal? Weder Get-ChildItem noch Remove-Item erzeugt Ausgaben?

    Möchte später dann auch mal ein Log von meiner Löscherei...

     

    Habt ihr noch nen Tip? Oder gebt ihr auch gleich auf wie ich :cool:

     

    Gebs gleich an meinen Kollegen, der nen 5zeiler in Pearl draus machen soll... :D

     

    Dabei wollt ich das "winzige Ding" "mal eben kurz" in PS machen um den ersten Schritt weg von Pearl hin zu bekommen! :jau:

     

    Danke

  12. Hi Frank,

     

    danke, das hatte ich mittlerweile aus diesem guten Artikel verstanden: http://www.admin-source.de/BlogDeu/963/import-csv-workshop

     

    Jetzt hab ich noch zwei Showstopper:

    1. Innerhalb von ForFiles werden die Variablen nicht aufgelöst. Habe versucht sie mit '' oder "" zu maskieren, hilft aber nicht.

    forfiles /P $_.pfad /s /m $_.dateistring /d -$_.alter /c “cmd /c del @file” 
    

    2. Würd ich gern Systemvariablen verwenden, wie zB %TMP%...das bekomm ich auch nicht hin. Klar ist, dass ich in PS $env: verwenden muss.

    Ich würde ja auch in der config Datei schon was brauchbares eintragen wie $env:TMP oder $TMP...aber das wird alles nicht aufgelöst.

    Muss das speziell maskiert werden?

     

    Danke

  13. Hi Frank,

     

    danke für den Ansatz. Da ich ForFiles direkt aus dem PS Skript aufrufen kann, konnte ich keinen Nachteil erkennen.

    Mit ForFiles wäre es in einer Zeile erledigt gewesen...ich versuch mein Glück.

     

    Was mir nicht klar ist an deinem Code Beispiel oben:

    - Muss ich das Löschen mit in die Schleife packen oder dort nur die Variablen füllen?

    und

    - Wie sage ich ihm, dass "$_.Pfad, $_.DateiString und $_.Alter" die Variablen genau so in genau dieser Reihenfolge zu verwenden sind? Wird das durch die Reihenfolge selbst vorgegeben?

     

    Bewege mich gerade das erste Mal jenseits von 1-5 zeiligen und einfachen Batches...

     

    Danke

  14. Tach Skript Freunde,

     

    wollte heute mal ein neues Skript bauen, das mir diverse Verzeichnisse von bestimmten Dateien mit bestimmtem Alter löscht.

    Dazu habe ich immer erfolgreich forfiles eingesetzt.

    Das möchte ich auch weiterhin tun...da aber öfter mal Verzeichnisse hinzukommen, alte weg fallen usw. dachte ich an eine config Datei, die ungefähr so aussehen könnte:

     

    Pfad;DateiString;Alter

    %TMP%;*.TMP;15

    E:\Backups;EigeneDateien;30

    usw.

     

    ...um damit folgenden Befehl zu füllen:

    forfiles /P VARIABLE1 /s /m VARIABLE2 /d -VARIABLE3 /c “cmd /c del @file”

     

    Hab dabei an Powershell und vllt Get-Content gedacht?

     

    Bin aber überhaupt nicht sicher ob das der richtige Ansatz ist.

     

    Müsste dem Get-Content sagen er soll immer bis zum Semikolon lesen =VARIABLE1, bis zum nächsten Semikolon VARIABLE2, dann VARIABLE3.

    Nächste Zeile bedeutet nächster forfiles Befehl...

     

    Bin für jeden Hinweis dankbar...

     

    ItalianStallion

  15. Hallo Zusammen,

     

    ich weiss das Thema is schon paar Tage alt, aber ich hab exakt, das Selbe Problem in exakt der selben Konstellation.

    Win7-SP1 und WinXP-SP3 im AD und Fileserver Netapp.

    Die beiden Rechner sehen unterschiedliche Stände in Netzlaufwerken.

    Ich kann auch keinen Zusammenhang feststellen.

    Manchmal drück ich zwischen 10 und 20 mal F5 und die eben erstellte Datei erscheint auf dem anderen Rechner, manchmal muss ich 50mal F5 drücken, manchmal muss ich einfach nur 10, 20 oder 30min. warten und manchmal hilgt n Neustart.

     

    Ich sehe keinen Zusammenhang.

     

    Es ist auch nicht so, dass alle Win7 Rechner im Netz die dateien sehen und nur die WinXP nich oder umgekehrt.

     

    Haben schon folgendes versucht laut MS:

     

    netsh int tcp set global chimney=disabled

    netsh int tcp set global rss=disabled

    netsh int ip set global taskoffload=disabled

    netsh int tcp set global autotuninglevel=disabled

    netsh int tcp set global congestionprovider=none

    netsh int tcp set global ecncapability=disabled

    netsh int tcp set global timestamps=disabled

    reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v EnableTCPA /t REG_DWORD /d "0" /f

     

    @Truhe72

    Habt ihr das Problem gelöst?

     

    Danke und Grüße

    Stallion

  16. Yeah, du bist der Größte! ;-)

     

    Habs eben selbst gefunden...Cache steht auf 24 Stunden...hätte auch Geduldig sein können!

     

    SID gelöscht und gleich nochmal mit cifs lookup abgefragt und BAM kam der richtige Name zurück...nicht nur Problem gelöst sondern für die Zukunft gleich etwas mit über den Filer gelernt!

     

    Danke

    Stallion

     

    Ach und: Ich bekomm mit fsecurity nix vernünftiges zurück! Bin glaub ich zu doof für die Syntax! ;)

  17. Ei ei ei...bei fsecurity bekomm ich keinen Output.

    Es stimmt wohl was mit der Syntax nicht und ich kriegs nich vernünftig hin...

     

    Hab aber nochmal cifs lookup ausgeführt...diesmal auf die richtige SID...und siehe da:

     

    Er gibt den alten Gruppenname zurück!

     

    Sorry, dass ichs vorhin nich bemerkt hab, muss wohl gepennt haben!

     

    Was sagt mir das jetzt?

     

    Der Filer hat holt keine vernünftigen Infos von den DCs?

     

    Danke

    Stallion

  18. Servus Carlito und Danke für deine Rückmeldung!

     

    cifs lookup %SID% gibt den richtigen Namen zurück...wobei ich eigentlich davon ausgehen würde, dass der Filer was das Listing der ACLs angeht keine Rolle spielt auch wenn er die Files hostet.

     

    Vielleicht noch eine Idee?

     

    Was macht denn mein Client in dem Moment wo ich mir die SecurityEinstellungen auflisten lasse?

     

    Fragt er seinen LOGONSERVER an um die SIDs aufzulösen?

     

    Grüße

    Stallion

×
×
  • Neu erstellen...