none
Lange Dateinamen in Textfile schreiben

    Frage

  • Hallo NG,

    leider bin ich noch Newbie in Sachen PowerShell und hoffe auf eure Hilfe... Ich möchte gerne zu lange Dateinamen sowie die länge in ein Textfile schreiben. Aber irgendwie gelingt es mir nicht.

    $a = Get-ChildItem c:\tmp -recurse
    foreach ($value in $a)
    {
    	if ($value.fullname.length -gt 43)
    	{
    		write-host $value.fullname `t $value.fullname.length
    	}
    }
    
    
    $a|out-file c:\tmp\test.txt
    Add-content  c:\tmp\test.txt $a
    
    

    Im Textfile sollte es in etwa so aussehen:

    Pfad:                                                                                                       Länge:

    C:\tmp\XPhone UC (4.4)\Setup64\FaxPrinterDriver\64TS\Data1.cab      62
    C:\tmp\XPhone UC (4.4)\Setup64\FaxPrinterDriver\64TS\setup.exe      62
    C:\tmp\XPhone UC (4.4)\Setup64\FaxPrinterDriver\64TS\Setup.ini        62
    C:\tmp\XPhone UC (4.4)\Setup64\FaxPrinterDriver\64TS\setup.iss        62

    Danke für eure Hilfe.

    Arno

    Mittwoch, 12. April 2017 08:19

Antworten

  • $a = Get-ChildItem C:\tmp -recurse
    $out = foreach ($value in $a) #mit "$out = ... " speicherst du alle Ergebnisse in der variable $out
    {
    	if ($value.fullname.length -gt 43)
    	{
            [pscustomobject]@{ #hier erstellst du ein eigenes Powershell Objekt, Objkte lassen sich besser weiterverarbeiten als Text
                Pfad = $value.fullname
                Länge = $value.fullname.length
            }
    	}
    }
    #Ergebniss in eine Csv Datei exportieren
    $out | Export-Csv -Path C:\tmp\test.csv -Delimiter ';' -NoTypeInformation

    Mittwoch, 12. April 2017 09:20
  • Wenn ich mich nicht irre, schlägt die Limitierung auf Pfade mit einer Länge von mehr als 256 auch in der Powershell zu. Es dürfte also vermutlich schwierig werden, die Länge zu ermitteln.

    Ich benutze robocoby mit der Option "/L" und parse dann den Output entsprechend. 

    Edit: ... ich hatte überlesen, dass es nur um Pfade - länger als 43 Zeichen - gehen soll ... 

    dann vielleicht so hier:

    Get-ChildItem c:\tmp -recurse | 
        Where-Object {$_.FullName.Length -gt 43} | 
            Select-Object -Property @{Name='Pfad';Expression={$_.FullName}},@{Name='Länge';Expression={$_.FullName.Length}} -OutVariable Ergebnis
    

    ... und wenn Du magst, kannst Du das Ergebnis auch noch in eine CSV-Datei exportieren:

    $Ergebnis | Export-CSV -Path C:\Sample\Ergebnis.CSV -Delimiter ';' -Encoding UTF8 -NoTypeInformation

    (alles ungetestet)  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    Mittwoch, 12. April 2017 09:30
  • War schon fast richtig.
    Du musst nur entweder alle Werte erst sammeln (z.b. einem Array zuweisen) und dann am Ende schreiben oder jeden Wert direkt in die Datei schreiben. Du hast die gewünschten Werte einfach nur in die Console ausgegeben, verworfen und dann am Ende den Inhalt von $a, welcher ja das komplette Ergebnis von get-childitem beinhaltet versucht in die Datei zu schreiben.
    Außerdem musst du die Zeile die du schreiben willst, mit Anführungszeichen umgeben und die Werte als Unterausdruck (SubExpression) kennzeichen mit $(). Sonst würde nur der erste Teil $value mit seinem dem Inhalt ersetzt und nicht die gewünschte Eigenschaft wie .Fullname.

    So gehts:

    $data = Get-ChildItem c:\tmp -recurse
    $output = "c:\tmp\test.txt"

    foreach ($value in $data) {
        if ($value.fullname.length -gt 43) {
            add-content -path $output -value "$($value.fullname) `t $($value.fullname.length)"
        }
    }
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 12. April 2017 09:33
    Moderator

Alle Antworten

  • $a = Get-ChildItem C:\tmp -recurse
    $out = foreach ($value in $a) #mit "$out = ... " speicherst du alle Ergebnisse in der variable $out
    {
    	if ($value.fullname.length -gt 43)
    	{
            [pscustomobject]@{ #hier erstellst du ein eigenes Powershell Objekt, Objkte lassen sich besser weiterverarbeiten als Text
                Pfad = $value.fullname
                Länge = $value.fullname.length
            }
    	}
    }
    #Ergebniss in eine Csv Datei exportieren
    $out | Export-Csv -Path C:\tmp\test.csv -Delimiter ';' -NoTypeInformation

    Mittwoch, 12. April 2017 09:20
  • Wenn ich mich nicht irre, schlägt die Limitierung auf Pfade mit einer Länge von mehr als 256 auch in der Powershell zu. Es dürfte also vermutlich schwierig werden, die Länge zu ermitteln.

    Ich benutze robocoby mit der Option "/L" und parse dann den Output entsprechend. 

    Edit: ... ich hatte überlesen, dass es nur um Pfade - länger als 43 Zeichen - gehen soll ... 

    dann vielleicht so hier:

    Get-ChildItem c:\tmp -recurse | 
        Where-Object {$_.FullName.Length -gt 43} | 
            Select-Object -Property @{Name='Pfad';Expression={$_.FullName}},@{Name='Länge';Expression={$_.FullName.Length}} -OutVariable Ergebnis
    

    ... und wenn Du magst, kannst Du das Ergebnis auch noch in eine CSV-Datei exportieren:

    $Ergebnis | Export-CSV -Path C:\Sample\Ergebnis.CSV -Delimiter ';' -Encoding UTF8 -NoTypeInformation

    (alles ungetestet)  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    Mittwoch, 12. April 2017 09:30
  • War schon fast richtig.
    Du musst nur entweder alle Werte erst sammeln (z.b. einem Array zuweisen) und dann am Ende schreiben oder jeden Wert direkt in die Datei schreiben. Du hast die gewünschten Werte einfach nur in die Console ausgegeben, verworfen und dann am Ende den Inhalt von $a, welcher ja das komplette Ergebnis von get-childitem beinhaltet versucht in die Datei zu schreiben.
    Außerdem musst du die Zeile die du schreiben willst, mit Anführungszeichen umgeben und die Werte als Unterausdruck (SubExpression) kennzeichen mit $(). Sonst würde nur der erste Teil $value mit seinem dem Inhalt ersetzt und nicht die gewünschte Eigenschaft wie .Fullname.

    So gehts:

    $data = Get-ChildItem c:\tmp -recurse
    $output = "c:\tmp\test.txt"

    foreach ($value in $data) {
        if ($value.fullname.length -gt 43) {
            add-content -path $output -value "$($value.fullname) `t $($value.fullname.length)"
        }
    }
     
    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 12. April 2017 09:33
    Moderator
  • Wenn ich mich nicht irre, schlägt die Limitierung auf Pfade mit einer Länge von mehr als 256 auch in der Powershell zu. Es dürfte also vermutlich schwierig werden, die Länge zu ermitteln.


    Also mit neueren Windows Versionen geht das auch mit der PowerShell ganz gut.

    Klick

    Beste Gruesse
    brima

    Mittwoch, 12. April 2017 11:43
  • Supi Tipp. Danke. Muss ich gleich ma probieren.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 12. April 2017 12:08
  • Wenn ich mich nicht irre, schlägt die Limitierung auf Pfade mit einer Länge von mehr als 256 auch in der Powershell zu. Es dürfte also vermutlich schwierig werden, die Länge zu ermitteln.

    Man kann zumindest die Exception auswerten. Allerdings steht in der Exception nicht die Datei mit dem überlangen Dateinamen, sondern dessen Verzeichnisname drin. Also in etwa so (-1 gibt dann an, dass es eine Exception war):

    # Get-LongPaths.ps1
     
    <#
    .SYNOPSIS
       Gets files and directories in a specified path and its sub-directories those length exceed a specified minimum.
    .PARAMETER Path
       Specifies the path. The path must be a directory.
    .PARAMETER MinLength
       Specifies the minimum length. The default is 260 characters.
    #>
    
    #Requires -Version 2.0
    
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$false,Position=0)]
        [ValidateScript({Test-Path -Path $_ -PathType Container})]
        [string]$Path = $pwd,
     
        [Parameter(Mandatory=$false)]
        [ValidateRange(1,260)]
        [int]$MinLength = 260
    )
     
    Get-ChildItem -Path $Path -Recurse -Force -ErrorVariable FSError -ErrorAction SilentlyContinue | ForEach-Object {
        if ($_.FullName.Length -ge $MinLength)
        {
            [PSCustomObject] @{
                PathLength = $_.FullName.Length
                Path = $_.FullName
            }
        }
    }
    
    $FSError | ForEach-Object {
        if ($_.CategoryInfo.Reason -eq 'PathTooLongException')
        {
            [PSCustomObject] @{
                PathLength = -1
                Path = $_.TargetObject
            }
        }
    }
    

    Donnerstag, 20. April 2017 14:54