Batch Datei automatisiert befüllen?

Begonnen von Trimonium, Januar 03, 2020, 11:23:56

« vorheriges - nächstes »

LED ZEPPELIN

 Verzeichnis von T:\... und morgen fahrt ihr zur Hoelle

18.06.2018  13:50    <DIR>                       .
18.06.2018  13:50    <DIR>                       ..
08.08.2009  17:36     3.124.650.616 UNDMOR~1.TS  ... und morgen fahrt ihr zur Hoelle.TS
               1 Datei(en),  3.124.650.616 Bytes
               2 Verzeichnis(se), 13.209.103.360 Bytes frei

Bisher waren Ordner mit nur einer Datei auch kein Problem.
Die Datei wurde einfach auf die neue HDD geschrieben.
Was mir die Arbeit natürlich massiv erleichtert.


tsduser

Na, die Quell- und Zielordnerfestlegung...

Das Skript sollte jetzt so aussehen:
# Quellverzeichnis mit Ordnern
$Quelle = "N:\Test\"

# Zielverzeichnis der .ts Ausgabedatei(en)
$Ziel = "S:\"

# falls "\" am Ende von Ziel vergessen
if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }

# falls Zielverzeichnis existiert
if ( Test-Path -Path $Ziel -PathType Container ) {

    # Einlesen der Verzeichnisse im Quellordner
    $folders = Get-ChildItem -Directory -Path $Quelle

    # falls Ordner vorhanden
    if ( $folders.Count -ne 0 ) {
        foreach ( $ordner in $folders ) {
            # Kontrollausgabe
            $ordner.FullName
            # Name der Zieldatei
            $Stub = $Ziel + $ordner.BaseName
            # neue Datei
            $target = $Stub + ".ts"
            # bei Leerzeichen Anfuehrungszeichen hinzu
            $target = "`"" + $target + "`""
            # Suchmaske fuer Dateien im Ordner
            $files = $ordner.FullName + "\*.ts"

            # falls weder Zieldatei noch getestete Zieldatei vorhanden sind...
            if ( -not ( Test-Path -Path $target ) ) {
                # bei Leerzeichen Anfuehrungszeichen hinzu wg. DOS
                $dateien = Get-ChildItem -File -Path $files | Sort-Object -Property Name
                if ( $dateien.Count -ne 0 ) {
                    $files = " `""+$dateien[0].FullName+"`""
                    for ( $i = 1 ; $i -lt $dateien.Count ; $i++ ) { $files += " + `""+($dateien[$i].FullName)+"`" " }
                    # Combine per DOS-copy anwerfen
                    Start-Process -FilePath "$env:comspec" -ArgumentList "/c","copy","/b",$files,$target -Wait
                    # nach jedem Verzeichnis auf Enter-Taste warten
#                    Read-Host -Prompt "Enter..."
                } else { Write-Host "Keine .ts-Dateien in " $ordner " gefunden." }
            }
        }
    } else { Write-Host "Keine Ordner in $Quelle gefunden." }
} else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }


Zumindest funktioniert es so bei mir mit einem Ordner "1 Mord für 2" mit einer einzelnen (allerdings leeren) Datei "1 Mord für 2.TS" drin (und einer Anpassung von Quelle und Ziel).

Das Verzeichnis mit den Punkten am Anfang ist vmtl. ein ganz anderes Problem. Wie Du bei den Listings siehst, gibt es da auch immer zwei Verzeichnisse "." und ".." in jedem Unterverzeichnis, die eine besondere Bedeutung haben. Vielleicht entfernst Du die Punkte einfach aus dem Ordner- und den Dateinamen...

LED ZEPPELIN

So sieht es jetzt komplett aus:
# Quellverzeichnis mit Ordnern
$Quelle = "I:"

# Zielverzeichnis der .ts Ausgabedatei(en)
$Ziel = "N:\"

# falls "\" am Ende von Ziel vergessen
if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }

# falls Zielverzeichnis existiert
if ( Test-Path -Path $Ziel -PathType Container ) {

    # Einlesen der Verzeichnisse im Quellordner
    $folders = Get-ChildItem -Directory -Path $Quelle

    # falls Ordner vorhanden
    if ( $folders.Count -ne 0 ) {
        foreach ( $ordner in $folders ) {
            # Kontrollausgabe
            $ordner.FullName
            # Name der Zieldatei
            $Stub = $Ziel + $ordner.BaseName
            # neue Datei
            $target = $Stub + ".ts"
            # bei Leerzeichen Anfuehrungszeichen hinzu
            $target = "`"" + $target + "`""
            # Suchmaske fuer Dateien im Ordner
            $files = $ordner.FullName + "\*.ts"

            # falls weder Zieldatei noch getestete Zieldatei vorhanden sind...
            if ( -not ( Test-Path -Path $target ) ) {
                # bei Leerzeichen Anfuehrungszeichen hinzu wg. DOS
                $dateien = Get-ChildItem -File -Path $files | Sort-Object -Property Name
if ( $dateien.Count -ne 0 ) {
$files = " `""+$dateien[0].FullName+"`""
for ( $i = 1 ; $i -lt $dateien.Count ; $i++ ) { $files += " + `""+($dateien[$i].FullName)+"`" " }
                # Combine per DOS-copy anwerfen
                Start-Process -FilePath "$env:comspec" -ArgumentList "/c","copy","/b",$files,$target -Wait
                # nach jedem Verzeichnis auf Enter-Taste warten
#                Read-Host -Prompt "Enter..."
} else { Write-Host "Keine .ts-Dateien in " + $ordner.Fullname + " gefunden." }
            }
        }
    } else { Write-Host "Keine Ordner in $Quelle gefunden." }
} else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }

Die Fehler bleiben aber.
Manche Ordner mit nur einer Datei werden neu geschrieben, zb. T:\100 Songs, die die Welt bewegten 1 und 2

Deshalb hier das Verzeichnis:

Verzeichnis von T:\100 Songs, die die Welt bewegten 1

18.06.2018  16:25    <DIR>                       .
18.06.2018  16:25    <DIR>                       ..
03.12.2013  10:12         1.904.131 100SON~1.DES 100 Songs, die die Welt bewegten.DESC
03.12.2013  10:20           196.608 100SON~1.MKS 100 Songs, die die Welt bewegten.MKS
03.12.2013  10:20             3.261 100SON~1.REC 100 Songs, die die Welt bewegten.REC
03.12.2013  10:12     3.302.729.866 100SON~1.TS  100 Songs, die die Welt bewegten.TS
03.12.2013  10:12                24 CELLTI~1.TXT CellTimes.txt
               5 Datei(en),  3.304.833.890 Bytes
               2 Verzeichnis(se), 13.209.103.360 Bytes frei

12 Uhr mittags wurde jetzt zusammengefügt

LED ZEPPELIN

Sorry.

Die Quell und Zieldatei ändere ich natürlich immer in T und I
Ich versuch mal das neue von Dir.

PS C:\Users\ICH> # Quellverzeichnis mit Ordnern
$Quelle = "T:\"

# Zielverzeichnis der .ts Ausgabedatei(en)
$Ziel = "I:\"

# falls "\" am Ende von Ziel vergessen
if ( $Ziel.Substring($Ziel.Length-1) -ne "\" ) { $Ziel += "\" }

# falls Zielverzeichnis existiert
if ( Test-Path -Path $Ziel -PathType Container ) {

    # Einlesen der Verzeichnisse im Quellordner
    $folders = Get-ChildItem -Directory -Path $Quelle

    # falls Ordner vorhanden
    if ( $folders.Count -ne 0 ) {
        foreach ( $ordner in $folders ) {
            # Kontrollausgabe
            $ordner.FullName
            # Name der Zieldatei
            $Stub = $Ziel + $ordner.BaseName
            # neue Datei
            $target = $Stub + ".ts"
            # bei Leerzeichen Anfuehrungszeichen hinzu
            $target = "`"" + $target + "`""
            # Suchmaske fuer Dateien im Ordner
            $files = $ordner.FullName + "\*.ts"

            # falls weder Zieldatei noch getestete Zieldatei vorhanden sind...
            if ( -not ( Test-Path -Path $target ) ) {
                # bei Leerzeichen Anfuehrungszeichen hinzu wg. DOS
                $dateien = Get-ChildItem -File -Path $files | Sort-Object -Property Name
                if ( $dateien.Count -ne 0 ) {
                    $files = " `""+$dateien[0].FullName+"`""
                    for ( $i = 1 ; $i -lt $dateien.Count ; $i++ ) { $files += " + `""+($dateien[$i].FullName)+"`" " }
                    # Combine per DOS-copy anwerfen
                    Start-Process -FilePath "$env:comspec" -ArgumentList "/c","copy","/b",$files,$target -Wait
                    # nach jedem Verzeichnis auf Enter-Taste warten
#                    Read-Host -Prompt "Enter..."
                } else { Write-Host "Keine .ts-Dateien in " $ordner " gefunden." }
            }
        }
    } else { Write-Host "Keine Ordner in $Quelle gefunden." }
} else { Write-Host "Zielverzeichnis $Ziel existiert nicht!" }
T:\1 Mord für 2
Keine .ts-Dateien in  1 Mord für 2  gefunden.
T:\100 Songs, die die Welt bewegten 1
T:\100 Songs, die die Welt bewegten 2

1 Mord für 2 funktioniert trotzdem nicht.

Verzeichnis von T:\1 Mord für 2

07.08.2010  13:51    <DIR>                       .
07.08.2010  13:51    <DIR>                       ..
07.08.2010  13:51           971.308 1MORDF~1.DES 1 Mord für 2.DESC
07.08.2010  13:54           196.608 1MORDF~1.MKS 1 Mord für 2.MKS
07.08.2010  13:54             2.729 1MORDF~1.REC 1 Mord für 2.REC
07.08.2010  13:51     1.656.908.517 1MORDF~1.TS  1 Mord für 2.TS
               4 Datei(en),  1.658.079.162 Bytes
               2 Verzeichnis(se), 13.209.103.360 Bytes frei

... und morgen habe ich die Punkte entfernt.
liegt jetzt natürlich weiter hinten und kommt erst später dran


LED ZEPPELIN

#109
Es sieht etwas danach aus, dass jetzt nur noch Ordner Probleme machen in denen nur noch die .ts Dateien existieren.
z.B.:
Verzeichnis von T:\8 Blickwinkel

18.06.2018  13:50    <DIR>                       .
18.06.2018  13:50    <DIR>                       ..
07.09.2009  22:24     2.547.982.424 8BLICK~1.TS  8 Blickwinkel.TS
               1 Datei(en),  2.547.982.424 Bytes
               2 Verzeichnis(se), 13.209.103.360 Bytes frei

Kann das sein?
Es wird doch nur danach gesucht. Versteh ich nicht.

Ich lass jetzt mal etwas laufen und prüfe ob der Verdacht sich bestätigt.

LED ZEPPELIN

Das läßt sich bestätigen.
Wenn nur die .ts Dateien im Ordner sind werden sie nicht gefunden.

Mir fällt gerade noch auf dass die Dateien nicht auf .ts sondern auf .TS enden.
Spielt das eine Rolle?

Bei ts4 oder TS4 war das bisher nicht relevant denke ich.

Wenn sich
Dateiname.TS und
Dateiname1.TS
im Ordner befinden werden sie aber korrekt zusammengefügt.

tsduser

Nein, gross/klein macht keinen Unterschied; da werden (i.A.) mit dem Muster "*.ts" alle Varianten gefunden.

Wie ich oben schrieb, habe ich das mit genau nur der einen einzelnen Datei im Verzeichnis und grossem .TS problemlos bei mir durchlaufen lassen.

Fuer den Moment habe ich keine Idee...

Probier' mal Get-ChildItem "T:\1 Mord für 2" | select -Property * direkt auf dem PowerShell-Prompt.

LED ZEPPELIN

Was heißt:
direkt auf dem PowerShell-Prompt.

tsduser

Da, wo Du frueher immer die kompletten Skripte hinkopiert hast.
Entweder in den unteren blauen Fensterteil der Powershell ISE, oder "Windows PowerShell" aus dem Startmenue.
Wo der Cursor blinkt hinter "PS C:\Users\ICH>". Das nennt man Prompt.

LED ZEPPELIN

Wenn ich die Zusatzdateien aus einem anderen Ordner reinkopiere und die Datei in .ts umbenenne statt .TS funktioniert es.
Echt seltsam würde ich sagen.

LED ZEPPELIN

Zitat von: tsduser am Juni 13, 2020, 23:29:43
Da, wo Du frueher immer die kompletten Skripte hinkopiert hast.
Entweder in den unteren blauen Fensterteil der Powershell ISE, oder "Windows PowerShell" aus dem Startmenue.
Wo der Cursor blinkt hinter "PS C:\Users\ICH>". Das nennt man Prompt.

Mach ich wenn es durchgelaufen ist. Wird noch dauern.

LED ZEPPELIN

Hier das Ergebnis

PS C:\Users\ICH> Get-ChildItem "T:\1 Mord für 2" | select -Property *


PSPath            : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2\1 Mord für 2.DESC
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2
PSChildName       : 1 Mord für 2.DESC
PSDrive           : T
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a----
VersionInfo       : File:             T:\1 Mord für 2\1 Mord für 2.DESC
                    InternalName:     
                    OriginalFilename:
                    FileVersion:     
                    FileDescription: 
                    Product:         
                    ProductVersion:   
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:         
                   
BaseName          : 1 Mord für 2
Target            : {}
LinkType          :
Name              : 1 Mord für 2.DESC
Length            : 971308
DirectoryName     : T:\1 Mord für 2
Directory         : T:\1 Mord für 2
IsReadOnly        : False
Exists            : True
FullName          : T:\1 Mord für 2\1 Mord für 2.DESC
Extension         : .DESC
CreationTime      : 07.08.2010 13:51:10
CreationTimeUtc   : 07.08.2010 11:51:10
LastAccessTime    : 07.08.2010 00:00:00
LastAccessTimeUtc : 06.08.2010 22:00:00
LastWriteTime     : 07.08.2010 13:51:10
LastWriteTimeUtc  : 07.08.2010 11:51:10
Attributes        : Archive

PSPath            : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2\1 Mord für 2.MKS
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2
PSChildName       : 1 Mord für 2.MKS
PSDrive           : T
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a----
VersionInfo       : File:             T:\1 Mord für 2\1 Mord für 2.MKS
                    InternalName:     
                    OriginalFilename:
                    FileVersion:     
                    FileDescription: 
                    Product:         
                    ProductVersion:   
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:         
                   
BaseName          : 1 Mord für 2
Target            : {}
LinkType          :
Name              : 1 Mord für 2.MKS
Length            : 196608
DirectoryName     : T:\1 Mord für 2
Directory         : T:\1 Mord für 2
IsReadOnly        : False
Exists            : True
FullName          : T:\1 Mord für 2\1 Mord für 2.MKS
Extension         : .MKS
CreationTime      : 07.08.2010 13:54:38
CreationTimeUtc   : 07.08.2010 11:54:38
LastAccessTime    : 13.06.2020 21:09:03
LastAccessTimeUtc : 13.06.2020 19:09:03
LastWriteTime     : 07.08.2010 13:54:38
LastWriteTimeUtc  : 07.08.2010 11:54:38
Attributes        : Archive

PSPath            : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2\1 Mord für 2.REC
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2
PSChildName       : 1 Mord für 2.REC
PSDrive           : T
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a----
VersionInfo       : File:             T:\1 Mord für 2\1 Mord für 2.REC
                    InternalName:     
                    OriginalFilename:
                    FileVersion:     
                    FileDescription: 
                    Product:         
                    ProductVersion:   
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:         
                   
BaseName          : 1 Mord für 2
Target            : {}
LinkType          :
Name              : 1 Mord für 2.REC
Length            : 2729
DirectoryName     : T:\1 Mord für 2
Directory         : T:\1 Mord für 2
IsReadOnly        : False
Exists            : True
FullName          : T:\1 Mord für 2\1 Mord für 2.REC
Extension         : .REC
CreationTime      : 07.08.2010 13:54:38
CreationTimeUtc   : 07.08.2010 11:54:38
LastAccessTime    : 07.08.2010 00:00:00
LastAccessTimeUtc : 06.08.2010 22:00:00
LastWriteTime     : 07.08.2010 13:54:38
LastWriteTimeUtc  : 07.08.2010 11:54:38
Attributes        : Archive

PSPath            : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2\1 Mord für 2.TS
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::T:\1 Mord für 2
PSChildName       : 1 Mord für 2.TS
PSDrive           : T
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : False
Mode              : -a----
VersionInfo       : File:             T:\1 Mord für 2\1 Mord für 2.TS
                    InternalName:     
                    OriginalFilename:
                    FileVersion:     
                    FileDescription: 
                    Product:         
                    ProductVersion:   
                    Debug:            False
                    Patched:          False
                    PreRelease:       False
                    PrivateBuild:     False
                    SpecialBuild:     False
                    Language:         
                   
BaseName          : 1 Mord für 2
Target            : {}
LinkType          :
Name              : 1 Mord für 2.TS
Length            : 1656908517
DirectoryName     : T:\1 Mord für 2
Directory         : T:\1 Mord für 2
IsReadOnly        : False
Exists            : True
FullName          : T:\1 Mord für 2\1 Mord für 2.TS
Extension         : .TS
CreationTime      : 07.08.2010 13:51:12
CreationTimeUtc   : 07.08.2010 11:51:12
LastAccessTime    : 13.06.2020 21:09:02
LastAccessTimeUtc : 13.06.2020 19:09:02
LastWriteTime     : 07.08.2010 13:51:12
LastWriteTimeUtc  : 07.08.2010 11:51:12
Attributes        : Archive

tsduser

#117
Tja, Microsoft...
Eigentlich sollte get-childitem nicht case-sensitive arbeiten, und bietet auch keine Parameter, um dieses Verhalten zu steuern.

Probier' es mal mit einer Suchmaske aus Grossbuchstaben, und pruefe, ob dann die mit kleinem .ts (z.B. "Back in Black...") ausgelassen werden:
            # Suchmaske fuer Dateien im Ordner
            $files = $ordner.FullName + "\*.TS"


PS:
Bei "Bill Clinton" waere ich auch auf das Ergebnis gespannt; denn da hat eine der beiden .ts ein Leerzeichen, und die andere nicht.

PS2:
Was fuer ein Dateisystem ist denn auf T: vorhanden? chkdsk t:

LED ZEPPELIN

Dateisystem NTFS.
Bill Clinton wurde ohne Probleme zusammengefügt.

Mit .TS funktioniert es. Habe ich gestern Nacht schon mal laufen lassen.

LED ZEPPELIN

Die mit kleinen Buchstaben werden ausgelassen. Nur der Vollständigkeit halber.

Vielen Dank mal wieder für den Support.


www.cypheros.de