Jump to content

stefan4711

Members
  • Gesamte Inhalte

    80
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von stefan4711

  1. So danke erst mal noch, leider scheint es so nicht ganz zu funktionieren, denke habe mich wieder mal falsch ausgedrückt. Die Server Bezeichnung wird immer nach folgendem Muster gebildet: Mustermann, Vorname - PC.

     

    Ich habe es jetzt nach deinem Vorschlag so stehen:

    $BeschreibungKey = 'HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters'
    $BeschreibungTest = Test-Path $BeschreibungKey
    $BeschreibungSrvcomment = (Get-ItemProperty $BeschreibungKey).Srvcomment
    Write-Verbose "Beschreibung Srvcomment: $BeschreibungSrvcomment" -Verbose
     
    $Description = $BeschreibungSrvcomment
    
    
    
    
    #Ausgabe
    
    'Beschreibung'     = $(-join ("`'", $Description, "`'"));

    Was er nun macht ist folgendes (oben die Spaltennamen):

     

    Hostname             Beschreibung      Seriennummer    .... ... ..  ....

    'Mustermann       Vorname - PC'      ............

     

    Er macht also 2 Fehler, er teilt den String weiterhin auf eine zweite Spalte auf, in der sonst was ganz anderes stehen soll, es werden zusätzlich noch 2 überflüssige ' erzeugt. Irgendwas scheint an der Syntax noch nicht zu stimmen. Also nochmal, Für dieses Feld soll das , als Delimiter ignoriert werden, weil Komma bedeutet ja neue Spalte.

     

     

    lg

     

     

    Stef

     

  2. Na vielleicht tret ich der Sache ja noch etwas näher, manches ist ja wirklich eleganter als beim guten alten Batch. Bei der Gelegenheit würd ich gern noch eine kleine Frage einflechten. In meinem kleinen InventoryScript habe ich eine Variable defniert, welche sich aus der Systembeschreibung ergibt. Dort steht standardmässig sowas wie Name, Vorname - PC.  Zudammen mit anderen definierten Systemvariablen wird dieses dann in eine csv gepackt. Sieht auschnittsweise so aus:

     

    $BeschreibungKey = 'HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters'
    $BeschreibungTest = Test-Path $BeschreibungKey
    $BeschreibungSrvcomment = (Get-ItemProperty $BeschreibungKey).Srvcomment
    Write-Verbose "Beschreibung Srvcomment: $BeschreibungSrvcomment" -Verbose
    
    $Description = $BeschreibungSrvcomment
    
     

     

    Am Ende wird halrt eine CSV geschrieben, und zwar derart:

     

    #CSV Ausgbe
    $Ausgabe = [PSCustomObject]@{
    .
    .
    'Beschreibung'     =$Description;
    .
    .
      }
        $Ausgabe | Export-Csv -Path $DestinationFolder\Ausgabe.csv -NoTypeInformation

    Das Problem hierbei ist das Komma in der Beschreibung, leider bekomme ich es nicht hin, dass er mir hier keine zweite Spalte aufmacht, klar wegen dem Komma im csv. Kann ich da irgendwie eine Ausnahme erstellen für diese Variable, oder wäre die einzige Lösung einen anderen delimiter zu nehmen? Leider bin ich bei Google nicht so richtig fündig geworden

     

     

     

    lg und schönen Abend

     

     

    Stef

     

     

     

     

     

     

     

  3. weiß nicht ob das für mich noch so sehr viel Sinn macht, bin eigentlich in den meisten Fällen mit dem guten alten Batch gut zurecht gekommen, ist für mich auch wesentlich leichter lesbar, in Powershell sind mir definitiv zuviel geschweifte Klammern ;), da bekomm ich Augenkrebs. Aber ich schaue mal was Tante Google sagt

     

    Trotzdem erst mal recht herzlichen Dank

    Um Deien Frage zu beantworten, je es steht was bei Tante Google, aber wie bei so vielen Quelen was PS angeht passiert wieder mal nichts:

     

    Import-Csv .\OutputFiltered.csv | sort Hostname

     

     

    ok ich habs jetzt (blindes Huhn findet auch mal nen Korn lach)

     

    Import-Csv -Path 'C:\SC\CSVmerge\OutputFiltered.csv' | sort -Property "Hostname" | Export-CSV -Path C:\SC\CSVmerge\OutputSortedEnd.csv -Delimiter ',' -NoTypeInformation

     

    ein schönes Wochende noch

    • Like 1
  4. Also jetzt hab ichs so, der Pfad zu Summary.csv stimmt, aber jetzt macht er gar nichts

     

    data = Import-CSV C:\SC\CSVmerge\Summary.csv
    $lastTS = @{}
    $output = @{}
    for ($i=0; $i -lt $data.Count; $i++) {
        $curHostname = $data[$i].Hostname
        $curTS = $data[$i].Timestamp -as [datetime]
        if ($lastTS.ContainsKey($curHostname)) {
            if ($lastTS[$curHostname] -lt $curTS) {
                $lastTS[$curHostname] = $curTS
                $output[$curHostname] = $i
            }
        } else {
            $lastTS.Add($curHostname, $curTS)
            $output.Add($curHostname, $i)
        }
    }
    $outputSorted = New-Object System.Collections.Generic.List[PSObject]
    foreach($i in $output.Values) {
        $outputSorted.Add($data[$i])
    }
    $outputSorted | Export-CSV -Path C:\SC\CSVmerge\machines-sorted.csv -Delimiter ',' -NoTypeInformation

    :(

     

    lg

     

    stef

  5. Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, du meintest sicher jeweils in den Zeilen mit Output:

     

    Zitat

    $data = Import-CSV C:\SC\CSVmerge\Summary.csv
    $lastTS = @{}
    $output = @{}
    for ($i=0; $i -lt $data.Count; $i++) {
        $curHostname = $data[$i].Hostname
        $curTS = $data[$i].Timestamp -as [datetime]
        if ($lastTS.ContainsKey($curHostname)) {
            if ($lastTS[$curHostname] -lt $curTS) {
                $lastTS[$curHostname] = $curTS
                $output[$curHostname] = $i | Export-CSV -Path C:\SC\CSVmerge\output.csv -Delimiter ',' -NoTypeInformation
            }
        } else {
            $lastTS.Add($curHostname, $curTS)
            $output.Add($curHostname, $i) | Export-CSV -Path C:\SC\CSVmerge\output.csv -Delimiter ',' -NoTypeInformation
        }
    }
    foreach($i in $output.Values) {
        $data[$i]
    }

    die Outputdatei ist 1kb groß und zeigt beim öffnen keinen Inhalt, vielleicht fehlen mir ja noch irgendwelche cmdlets, die ich erst isstallieren muss

  6. Also ich hatte es folgendermaaßen probiert, nachdem ich mit Batch absolut nicht weiterkam:

     

    Zitat

    #Getting the Path of CSV file
    $inputCSVPath = 'Summary.csv'
    #The Import-Csv cmdlet creates table-like custom objects from the items in CSV files
    $inputCsv = Import-Csv $inputCSVPath | Sort-Object Timestamp -Unique
    #The Export-CSV cmdlet creates a CSV file of the objects that you submit.
    #Each object is a row that includes a comma-separated list of the object's property values.
    $inputCsv | Export-Csv "C:\Users\Riegert\Desktop\CSVmerge\Final.csv"  -NoTypeInformation

    Die Reihenfolge ist im Prinzip ertmal egal, klar wärs schön wenns nach Host sortiert wäre. Danke aber nochmal für die interessanten Lösungsansätze, werde ich mich mal durcharbeiten, melde mich dann wieder

     

     

    lg

     

    Stef

     

     

    Also folgendes:

     

    Also prinipiell scheint er bei allen Lösungen etwas zu machen, also auch keine doppelten, aber es schreibt leider keine Ergennis CSV. Schon komisch dass ich in anderen Foren zu dem Thema nur "Müll" gefunden habe.

     

    @CJ Wie bekomme ich es bei Deinem Ansatz hin dass er eine neue Datei schreibt, so im Fenster kann ich damit nicht viel anfangen, bin leioder noch nicht ganz so firm in Powershell, obgleich ich zugeben muss, dass man damit schon mehr anfangen kann als mit Batch.

     

    lg

     

    Stef

     

     

     

  7. Hallo werte Forengemeinde,

     

    ich beisse mich seit einigen Tagen an einem Problem fest, was wohl laut diverser Foren viele haben, dafür gab es auch schon haufenweise Lösungsvorschläge, aber nichts davon führte bei mir zum Erfolg. Es geht darum dass ich eine Inventarliste im CSV Format (kommagetrennt) habe, die sieht folgendermassen aus (Spaltenanzahl und Zeilenanzahl aus Komplexitätsgründen gekürzt)

     

    Zitat

    Hostname    Timestamp             Serial Number       Manufacturer          Model       
    RTA190504    11.11.2021 14:25    S4JY3833         LENOVO            30C5003CGE       
    RTA200601    11.11.2021 12:23    CZC02286W9        HP                HP ProDesk 600
    RTA201201    27.09.2021 08:39    33M6933            Dell Inc.         OptiPlex 3070    
    RTX54011      15.07.2021 18:19    7739-6127        Microsoft        Virtual Machine    
    NTX210708    12.11.2021 21:02    PF2WCBGR        LENOVO            82GN    
    NTX210708    13.11.2021 11:31    PF2WCBGR        LENOVO            82GN    
    NTX210708    13.11.2021 11:32    PF2WCBGR        LENOVO           82GN    
    NTX210708    13.11.2021 11:30    PF2WCBGR        LENOVO            82GN    
    NTX210708    13.11.2021 11:31    PF2WCBGR        LENOVO            82GN    
    NTX210708    13.11.2021 11:33    PF2WCBGR        LENOVO            82GN   

    Wie hier deutlich zu sehen sind von NTX210708 mehere Einträge vorhanden. Ist es möglich per Batch oder auch per PS alle doppelten Zeilen zu löschen, Dabei sollen die Zeilen behalten werden die dem aktuellstzen Timestamp entsprechen. In dem Fall von NTX... also der letzte.

     

    Vielleicht hat ja einer eine Idee?

     

     

    lg und schönes we

     

     

    Stef

  8. Hallo liebe Leute, heute mal eine kurze und knappe Frage. Ich habe ein kurzes Batch, welches ich über einen Parameter via Kontextmenu aufrufe. Dieses hat nur die Aufgabe Dateien ohne Endung mit der Endung jpg. zu versehen. Das Script ren2jpg.bat schaut so aus:

     

    @echo off & setlocal
    
    PushD "%1" &&(
    	  forfiles -s -m *.* -c "cmd /c ren *.* *.jpg"
         ) & PopD
    
    
    exit

    aufgerufen wird es wie gesagt über das Ordner Kontextmenu via CMD.EXE /c "ren2jpg %1>nul  & EXIT"

    Das klappt auch wunderbar, aber was mache ich bei Pfaden mit Leerzeichen im Pfad, da geht es nicht, normalerweise soll ja da was mit Leerzeichen gehen? Weiss da jemand Bescheid?

     

     

    lg

     

    Stefan

  9. Auch das geschieht nicht aus Jux und Dollerei, es gibt halt noch Altsysteme mit Images wo ein Exkollege, diverse Aufgaben auf Benutzer gesetzt hatte und das lief halt in einigen Fällen nicht. Also um es mal festzuhalten, ich habe keine lange Weile, die grundsäzliche Syntax scheint also zu stimmen, seh ich das richtig? Es gibt keine Erklärung warum er mal raus sringt und mal beide Zweige abarbeitet ? Dann bleibt mir wohkl nichts anderes übrig als das zu akzeptieren und das einfach nur zuüberschreiben, auch wenn mir das in einem Startscript nicht ganz so gut gefällt. Und es sollte wohlauch nicht relevant sein, was in der Domäne geändert wurde, es funktioniert ja auich lokal nicht.

     

    vielen Dank trotzdem

     

    lg

     

    Stefan

  10. Ja klar steht in der XML System drin, ich habe diese Prüfung ja auch nur gemacht, um unnötige Verzögerungen zu vermeiden. Es muss doch aber ne Erklärung geben warum das If nicht läuft, Ich habe den Aufgabenimport ja momentan auskomentiert. Und wie bereits erwähnt, vor einigen Monaten funktionierte das ganze ja auch noch. (Updates ? anderes Batchverhalten, wär ja nichts Neues);)

  11. So also noch mal, ich hatte auch beide EXITS schon draussen, ich habe dich nicht ignoriert, es passiert immer noch das selbe, wenn Systemaccount, dann steht da nichts zu machen, wenn nicht dann haut er so schnell raus das man nicht mehr gucken kann und es passiert nichts, ob mit oder gar keinem EXIT. ich befolge schon dass was Ihr sagt;). Einfach mal eine Aufgabe nehmen die unter System läuft, und danach auf was anderes umtragen, dann seht Ihr was ich meine.

     

    lg

     

     

    Stefan

  12. sorry, hatte jetzt schon mehrfach versucht das Script zu posten, ich habe die eigentliche Befehlszeile ausgeremt, dass sich hier nicht jeder an der Zeile aufhängt, auch das zweite Exit ist raus, trotzdem muss das Script ja irgendwie beendet werden. Jetzt sezehen also nur Echos drin, und trotzdem funktioniert es nicht

     

    Meine Frage lautet, was ist an der IF Anweisung faul, fehlt irgendwo ne Klammer?

    @Echo Off
    CD /D %~dp0
    SET "AF=C:\Users\Administrator\Downloads"
    
     FOR /f %%a in ('schtasks /query /TN _01_Regwerte_setzen /XML ^| findstr "UserId"') DO ( Set xml=%%a )
     set var2=%xml:~8,8%
     echo %var2%
     
    IF %var2%==S-1-5-18 (
      
      ECHO - Aufgabe laeuft bereits unter Systemaccount -
    	 Echo Es ist nichts zu machen
    	 pause
    	exit
    	 
     	 ) ELSE (
     
       pause
    	 ECHO - Aufgabe auf System umtragen
    	 ECHO Das sollte passieren wenn Aufgabe nicht unter System läuft, aber auch nur das
    	 pause
    	 REM FOR %%L in ( _01_Regwerte_setzen ) do SCHTASKS /Create /TN %%L /f /xml "%AF%\Aufgaben\%%L.xml">nul 2>&1
       pause
       )
     
    
     ECHO ALLES erledigt
     PAUSE
    	

    lg

     

    Stefan

     

  13. Dos habe ich doch, ich ändere per Script den Ausführungskontext einer Aufgabe, wenn diese nicht auf System steht, denke da war meine Antwort wohl noch nicht abgeschickt, ok dann probier ichs mal ohne EXIT, aber wie wird das CMD dann beendet? Und ja die For Schleife braucht es hier nicht,, in der Klammer stehen sonst aber noch weitere Aufgaben, und dann macht es doch wieder Sinn, oder? Ich wollte es hier übersichtlich halten, war nicht böse gemeint und verwirren wollte ich auch nicht.

     

    lg

     

    Stefan

     

     

     

  14. Hallo, danke für deine Antwort,

     

    also dann erklär ichs mal kurz, die Anweisungen einzeln fuktionieren aber, es geht mir halt hier nur um die Ablauflogik, irgend  etwas scheint mit dem If/Else nicht zu stimmen. Es wird geprüft ob die Aufgabe unter Systemkontext läuft, wenn ja wird nichts gemacht, wenn nein wird die Aufgabe auf System umgeschrieben, von einer XML Datei. Er springt hier aber direkt raus und bringt nicht mal das ECHO - Aufgabe auf System umtragen mit der darauffolgenden Pause, die natürlich hier nur zum Debugging dient und später natürlich keinen Sinn mehr macht, ebenso das Exit.
        

×
×
  • Neu erstellen...