cgboard - classic games
[Frage] Batch Scripting Dateien verschieben - Druckversion

+- cgboard - classic games (https://cgboard.raysworld.ch)
+-- Forum: Hard- und Software (https://cgboard.raysworld.ch/forumdisplay.php?fid=6)
+--- Forum: Software, Coding und GFX (https://cgboard.raysworld.ch/forumdisplay.php?fid=19)
+--- Thema: [Frage] Batch Scripting Dateien verschieben (/showthread.php?tid=27533)

Seiten: 1 2


Batch Scripting Dateien verschieben - Pobeller - 17.10.2022

Hallo Leute,

Ich sortiere grade ein paar Daten mit hilfe von einer bat

und zwar so:

@echo off
move *-eph.zip "H:\Englische Isos\EUPHORiA"
move *-TBT.zip  "H:\Englische Isos\TBT"
move *-nliso.zip "H:\Englische Isos\NLiSO"
move *-deviance.zip "H:\Englische Isos\DEViANCE"
move *-dev.zip "H:\Englische Isos\DEViANCE"
move *-razor*.zip "H:\Englische Isos\RAZOR1911"
move *-rzr.zip "H:\Englische Isos\RAZOR1911"
move *-fairlight.zip "H:\Englische Isos\FAiRLiGHT"
move *-flt.zip "H:\Englische Isos\FAiRLiGHT"
move *-trueiso.zip "H:\Englische Isos\TRUEiSO"
move *-intergang.zip "H:\Englische Isos\iNTERGANG"
move *-prophet.zip "H:\Englische Isos\PROPHET"



usw usw...

Jetzt ist es nur sehr mühsam die jeweiligen daten hinter dem - zu nehmen
und unterordner zu erstellen. das geht doch irgendwie bestimmt mit
so einer for schleife oder?

kann mir da jemand weiterhelfen?

wäre auch für tips dankbar um das ganze noch viel
mehr funktionabler zu machen.
ich konnte mal c unter windows 98 programmieren
aber das ist schon viel zu lange her.
Batch verstehe ich heutzutage da schon eher von der logik..

vielen dank


RE: Batch Scripting Dateien verschieben - GBuster - 17.10.2022

Hi,
irgendwie habe ich das Problem noch nicht ganz verstanden. Also ist es, dass du, statt für jede Release-Group ein eigenes Muster zu hinterlegen, lieber ein generisches haben möchtest?


RE: Batch Scripting Dateien verschieben - Pobeller - 17.10.2022

Verstehe deinen satz irgendwie nicht richtig.

ich möchte die zip dateien in unterordner verschieben.
es sollen alle dateien gescannt werden, und die bat soll
wenn ein file "Release.Name-GrOUP" "gescannt" wird
einen unterordner erstellen mit dem namen "GrOUP"

Hatte schonmal überlegt mit so einem textfile als
"Datenbank" für die Gruppen.

hoff ich konnte meinen grundgedanken so erklären


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

Ich würde für sowas Powershell nehmen, es ist einfach mächtiger als die Batch.

Mein Ansatz wäre es, in einer Variable den Grundpfad zu speichern, den Dateinamen zu splitten nach "-", dann hast du ja schon deinen Ordnernamen und
in einer If einweisung den Ordner (Grundpfad-Variable + teil des namens) erstellen oder wenn schon vorhanden, die Datei da rein schieben.
Das ganze dann in eine Schleife packen.

Probiere das mit Powershell aus, du wirst sehen es ist viel einfacher.

dein Quellpfad
dein Zielpfad

schleife anfang
dateinamen splitten
prüfen ob Ordner da oder neu erstellen
datei verschieben
schleife ende


RE: Batch Scripting Dateien verschieben - tomwatayan - 18.10.2022

Ich habe dir mal eine entsprechende Batchdatei gebaut. In Zeile 11 kannst du den Ausgabepfad ändern:
Set "OutputPath=H:\Englische Isos"

Funktioniert auch für Dateien mit Leerzeichen. Für Sonderzeichen geht's zumindest für Umlaute. Was exotischeres habe ich nicht ausprobiert.
Einfach die Batchdatei starten und die Dateien im aktuellen Verzeichnis werden alle verschoben.

Code:
@echo off
chcp 1252
setlocal enableextensions disabledelayedexpansion
call :SetVariables
FOR /f "tokens=*" %%G IN ('dir /b') DO (call :subroutine "%%G")
echo Alles erledigt
exit /b 0

:SetVariables
REM OutputPath: Hier den Ausgabepfad für die verschobenen Dateien eingeben
Set "OutputPath=H:\Englische Isos"
exit /b 0

:subroutine
For %%A in (%1) do (
    Set Folder=%%~dpA
    Set FullName=%%~nxA
    Set Name=%%~nA
    Set Extension=%%~xA
)
if exist "%FullName%\*" (
    echo Überspringe Ordner "%FullName%"
    exit /b 0
) else (
    if "%Extension%"==".bat" (
        echo Überspringe Batchdatei "%FullName%"
        exit /b 0
    )
)
call :getLastDashedSegment "%Name%"
if not exist "%OutputPath%\%lastDashedSegment%" (
    mkdir "%OutputPath%\%lastDashedSegment%"
)
move "%FullName%" "%OutputPath%\%lastDashedSegment%"
exit /b 0

:getLastDashedSegment
set "Input=%~1"
set "SpaceAsEscaped=%Input:Space=SpaceToken%"
set "SpacesAsTokens=%SpaceAsEscaped: =SpaceSign%"
set "DashesAsSpaces=%SpacesAsTokens:-= %"
if "%DashesAsSpaces%" EQU "%SpacesAsTokens%" (
    set "lastDashedSegment=Unknown"
    exit /b 0
)
for %%a in (%DashesAsSpaces%) do (
    call :replaceQuotedTokens "%%a"
)
exit /b 0

:replaceQuotedTokens
set "Input=%~1"
set "ReplacedSpaces=%Input:SpaceSign= %"
set "lastDashedSegment=%ReplacedSpaces:SpaceToken=Space%"
exit /b 0

Die Datei muss als ANSI gespeichert werden.


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

danke für den tip. habe mal n bisschen gelesen.

"Erstellen von Dateien und Schreiben von Daten in eine Datei

Es stehen mindestens zwei integrierte Methoden für das Erstellen von Dateien und das Schreiben von Daten in diese Dateien zur Verfügung. Sie können das Cmdlet „Out-File“ verwenden:

$text = 'Hello World!' | Out-File $text -FilePath D:\data\text.txt "

und als ergebniss bekomme ich:

"PS D:\> D:\hellow.ps1
Out-File : Das Argument für den Parameter "Encoding" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer
ist, und führen Sie den Befehl erneut aus.
In D:\hellow.ps1:1 Zeichen:35
+ $text = 'Hello World!' | Out-File $text -FilePath D:\data\text.txt
+ ~~~~~
+ CategoryInfo : InvalidData: (Smile [Out-File], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.OutFileCommand "

wobei Ordner erstellen mit:

PS D:\> D:\mkfldr.ps1
Verzeichnis: D:\Data


Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 18.10.2022 08:24 NewFolder

PS D:\> "

funktioniert.


RE: Batch Scripting Dateien verschieben - D2001-SP1 - 18.10.2022

(18.10.2022, 07:25)Pobeller schrieb: $text = 'Hello World!' | Out-File $text -FilePath D:\data\text.txt "

und als ergebniss bekomme ich:

"PS D:\> D:\hellow.ps1
Out-File : Das Argument für den Parameter "Encoding" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer [...]

Moin, durch die sogenannte Pipe "|" wird die Ausgabe des vorherigen Befehls automatisch an den nächsten Befehl durchgereicht. Du musst, bzw. darfst, beim Kommando "Out-File" also nicht noch einmmal die Variable angeben. So sollte es dann also klappen:

$text = 'Hello World!' | Out-File -FilePath D:\data\text.txt "

Das ist aber dann reiner Powershell Code, und kein Batch Scripting mehr.


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

So könnte es aussehen:

Code:
[string]$src = "C:\Users\andreas\Desktop\file"
[string]$dest = "C:\Users\andreas\Desktop\file\out"

# Quellverzeichniss einlesen
$fileList = Get-Item "$src\*"

# Anfang der Schleife
foreach ($file in $fileList) {

  # Sicher gehen dass nur Dateien angezeigt werden
  if( $file -is [System.IO.FileInfo]) {

    # aktuelle Datei anzeigen
    Write-Host "Datei inkl. Pfad: $file"

    $fileNamewoPath = [System.IO.Path]::GetFileNameWithoutExtension($file)

    Write-Host "Nur Dateiname: $fileNamewoPath"

    # Dateiname nach "-", gesplittet, zwei Teile, deswegen [1] am Ende
    # uns interessiert nur der zweite Teil
    $folderName = $fileNamewoPath.Split('-')[1]

    Write-Host "Der Teil, der uns interessiert: $folderName"

    # Prüfen ob das Verzeichniss existiert
    if(Test-Path "$dest\$foldername") {
      Write-Host "Ja, ist da"
    } else {
      Write-Host "nein, muss ich ehm erstellen"
    }
  }
}

Zum Scripten würde ich VSCode empfehlen, mit der Powershell erweiterung.

VSCode

Mit STRG+Ö öffnest du die Konsole.


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

Ok Danke funktioniert.

Ich sehe die vorteile der ps jetzt. war für mich vorher komplizierter als "echo HelloWorld > test.txt"

ok jetzt habe ich ne textdatei mit den filenamen.

jetzt würde ich gerne diesen datensatz nehmen und so filtern:

datei1-text.zip
datei2-txte.zip
datei3-text.zip

das nacher eine liste bei rauskommt die so aussieht

-text
-txte


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

Wozu die Liste?

Du kannst doch direkt in der Schleife Ordner erstellen und Dateien kopieren?

Oder verstehe ich was falsch?


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

(18.10.2022, 08:36)goodsubarita schrieb: Wozu die Liste?

Du kannst doch direkt in der Schleife Ordner erstellen und Dateien kopieren?

Oder verstehe ich was falsch?
Ziel für mich ist es, ein Script zu haben um

Ordner struktur anhand von Quell files
Und / oder meiner danbank.txt

Zu erstellen.
 Später soll es noch die dateien
In die richtigen Ordner verschieben

Und ganz grosse zukunftsmusik

--> die hash Werte der Dateien innerhalb
Der zip Dateien ermitteln und diese
Werte auch in einer Datenbank speichern

MySQL evtl ganz später mal


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

Ich glaube MySQL wäre wie Elefanten auf Spatze geworfen.

CSV oder JSON oder wenn es wirklich abertausende Einträge werden sollten, SQLITE

CSV ist superpraktisch, weil man die auch mit Excel editieren / mit Daten bestücken kann.


RE: Batch Scripting Dateien verschieben - D2001-SP1 - 18.10.2022

Also, goodsubarita hatte dir ja schon fast den kompletten Code für dein ursprüngliches Vorhaben gegeben. Es fehlten eigentlich nur noch die Befehle um Ordner zu erstellen und die Dateien zu kopieren. Das kann alles mit in die Schleife. Habe das hier gerade mal getestet, damit sollte das automatische erstellen der Ordner, und kopieren der Source Dateien problemlos funktionieren:

Code:
[string]$src = "D:\test"
[string]$dest = "D:\test\out"

# Quellverzeichniss einlesen
$fileList = Get-Item "$src\*"

# Anfang der Schleife
foreach ($file in $fileList) {

  # Sicher gehen dass nur Dateien angezeigt werden
  if( $file -is [System.IO.FileInfo]) {

    # aktuelle Datei anzeigen
    #Write-Host "Datei inkl. Pfad: $file"

    $fileNamewoPath = [System.IO.Path]::GetFileNameWithoutExtension($file)

    #Write-Host "Nur Dateiname: $fileNamewoPath"

    # Dateiname nach "-", gesplittet, zwei Teile, deswegen [1] am Ende
    # uns interessiert nur der zweite Teil
    $folderName = $fileNamewoPath.Split('-')[1]

    #Write-Host "Der Teil, der uns interessiert: $folderName"

    # Prüfen ob das Verzeichniss existiert
    if(Test-Path "$dest\$foldername") {

      Write-Host "Ordner $foldername existiert, kopiere Datei $fileNamewoPath"
      Copy-Item $file -Destination $dest\$folderName

    } else {

      Write-Host "Ordner $foldername wird erstellt, und Datei $fileNamewoPath kopiert"
      New-Item -Path $dest\$foldername -ItemType Directory | Out-Null
      Copy-Item $file -Destination $dest\$folderName

    }
  }
}



RE: Batch Scripting Dateien verschieben - tomwatayan - 18.10.2022

Für das Beispiel ist Powershell wirklich viel übersichtlicher als meine Batch-Lösung. Ich muss mich irgendwann auch mal mit Powershell befassen.

Eine Anmerkung: Copy-Item klingt nicht nach dem gleichen wie "move" in Batch, sondern eher, als hat man die Dateien dann doppelt?


RE: Batch Scripting Dateien verschieben - D2001-SP1 - 18.10.2022

(18.10.2022, 13:48)tomwatayan schrieb: Eine Anmerkung: Copy-Item klingt nicht nach dem gleichen wie "move" in Batch, sondern eher, als hat man die Dateien dann doppelt?

Jep, Copy-Item erstellt eine Kopie der original Datei, Move-Item wäre der Befehl zum tatsächlichen verschieben der Quelldatei. Ich persönlich finde Kopien immer besser, sollte im Script doch etwas schief laufen hat man immer noch die Ursprungsdateien im Original Zustand.


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

... dem ist nix mehr hinzuzufügen :-)

Sehe ich auch so.


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

Danke für die vielen zahlreichen tips. Bin grade wieder nach Hause gekommen
und werde gleich alles mal durchlesen und umsetzten.


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

whuut whuut es funzt.




function Show-CustomMenu
{
    param ([string]$menuname = 'Fancy File Tool')

    Clear-Host
    Write-Host "================ $menuname ================"
    Write-Host "1: Group Ordner erstellen von Daba"
    Write-Host "2: Group Ordner erstellen von Zips"
    Write-Host "3: Move Zips to Group Ordner"
    Write-Host "4: "
    Write-Host ""
    Write-host ""
    Write-Host ""
    Write-host ""
    Write-Host "Q: Ente"
    Write-Host ""
    Write-host ""
}


Show-CustomMenu –menuname 'Fancy File Tool'


$auswahl = Read-Host "What do you want todo today?"

switch ($auswahl){
    '1' {'Sie haben Option 1 gewählt.'}




            #Variabel machen evtl mit eingabe? Get-Location evtl

    '2' {  [string]$src = "D:\SortierApp"
            [string]$dest = "D:\SortierApp"


            # Quellverzeichniss einlesen
            $fileList = Get-Item "$src\*.zip"
            Write-Host $fileList
            # Anfang der Schleife
            foreach ($file in $fileList)
                    {

            # Sicher gehen dass nur Dateien angezeigt werden
                    if( $file -is [System.IO.FileInfo]) {

            # aktuelle Datei anzeigen
            Write-Host "Datei inkl. Pfad: $file"

            $fileNamewoPath = [System.IO.Path]::GetFileNameWithoutExtension($file)

            Write-Host "Nur Dateiname: $fileNamewoPath"

            # Dateiname nach "-", gesplittet, zwei Teile, deswegen [1] am Ende
            # uns interessiert nur der zweite Teil

            $folderName = $fileNamewoPath.Split('-')[1]

            Write-Host "Der Teil, der uns interessiert: $folderName"

            # Prüfen ob das Verzeichniss existiert

            if(Test-Path "$dest\$foldername")
           
              {
              Write-Host "Ja, ist da"
              }
           
            else
           
                {
                Write-Host "nein, muss ich ehm erstellen"
                New-Item -Path "$dest\$foldername" -ItemType Directory
                }
           
            }
    }    }









    '3' {'Option Nummer 3 gewählt.'}
    '4' {'Oder doch Nummer 4?!'}
    'q' {exit}
}








vielen lieben dank nochmal. powershell ist genau das richtige für mich vom gefühl her


RE: Batch Scripting Dateien verschieben - goodsubarita - 18.10.2022

Bitte :-)

Wenn du bei Powershell beliben willst, es gibt wie gesagt nix besseres als VSCode mit der PS erweiterung.
Probier's aus, du willst nie wieder anders Scripten...


RE: Batch Scripting Dateien verschieben - Pobeller - 18.10.2022

(18.10.2022, 13:48)tomwatayan schrieb: Für das Beispiel ist Powershell wirklich viel übersichtlicher als meine Batch-Lösung. Ich muss mich irgendwann auch mal mit Powershell befassen.

Eine Anmerkung: Copy-Item klingt nicht nach dem gleichen wie "move" in Batch, sondern eher, als hat man die Dateien dann doppelt?


Momentan ist move-item die beste lösung für mich da sämtliche einzusortierenden dateien unikate sind
also nix mit doppelt usw...

später mal wenn ich funktionen einbaue die mit dateinamen veränderungen zu tun haben
werde ich bis zum stable zustand auch nur kopien machen

(18.10.2022, 07:02)tomwatayan schrieb: Ich habe dir mal eine entsprechende Batchdatei gebaut. In Zeile 11 kannst du den Ausgabepfad ändern:
Set "OutputPath=H:\Englische Isos"

Funktioniert auch für Dateien mit Leerzeichen. Für Sonderzeichen geht's zumindest für Umlaute. Was exotischeres habe ich nicht ausprobiert.
Einfach die Batchdatei starten und die Dateien im aktuellen Verzeichnis werden alle verschoben.

Code:
@echo off
chcp 1252
setlocal enableextensions disabledelayedexpansion
call :SetVariables
FOR /f "tokens=*" %%G IN ('dir /b') DO (call :subroutine "%%G")
echo Alles erledigt
exit /b 0

:SetVariables
REM OutputPath: Hier den Ausgabepfad für die verschobenen Dateien eingeben
Set "OutputPath=H:\Englische Isos"
exit /b 0

:subroutine
For %%A in (%1) do (
    Set Folder=%%~dpA
    Set FullName=%%~nxA
    Set Name=%%~nA
    Set Extension=%%~xA
)
if exist "%FullName%\*" (
    echo Überspringe Ordner "%FullName%"
    exit /b 0
) else (
    if "%Extension%"==".bat" (
        echo Überspringe Batchdatei "%FullName%"
        exit /b 0
    )
)
call :getLastDashedSegment "%Name%"
if not exist "%OutputPath%\%lastDashedSegment%" (
    mkdir "%OutputPath%\%lastDashedSegment%"
)
move "%FullName%" "%OutputPath%\%lastDashedSegment%"
exit /b 0

:getLastDashedSegment
set "Input=%~1"
set "SpaceAsEscaped=%Input:Space=SpaceToken%"
set "SpacesAsTokens=%SpaceAsEscaped: =SpaceSign%"
set "DashesAsSpaces=%SpacesAsTokens:-= %"
if "%DashesAsSpaces%" EQU "%SpacesAsTokens%" (
    set "lastDashedSegment=Unknown"
    exit /b 0
)
for %%a in (%DashesAsSpaces%) do (
    call :replaceQuotedTokens "%%a"
)
exit /b 0

:replaceQuotedTokens
set "Input=%~1"
set "ReplacedSpaces=%Input:SpaceSign= %"
set "lastDashedSegment=%ReplacedSpaces:SpaceToken=Space%"
exit /b 0

Die Datei muss als ANSI gespeichert werden.

danke, ist archiviert kommt zum gebrauch wenn ich das script auf msdos umsetzen möchte

(18.10.2022, 12:12)D2001-SP1 schrieb: Also, goodsubarita hatte dir ja schon fast den kompletten Code für dein ursprüngliches Vorhaben gegeben. Es fehlten eigentlich nur noch die Befehle um Ordner zu erstellen und die Dateien zu kopieren. Das kann alles mit in die Schleife. Habe das hier gerade mal getestet, damit sollte das automatische erstellen der Ordner, und kopieren der Source Dateien problemlos funktionieren:

Code:
[string]$src = "D:\test"
[string]$dest = "D:\test\out"

# Quellverzeichniss einlesen
$fileList = Get-Item "$src\*"

# Anfang der Schleife
foreach ($file in $fileList) {

  # Sicher gehen dass nur Dateien angezeigt werden
  if( $file -is [System.IO.FileInfo]) {

    # aktuelle Datei anzeigen
    #Write-Host "Datei inkl. Pfad: $file"

    $fileNamewoPath = [System.IO.Path]::GetFileNameWithoutExtension($file)

    #Write-Host "Nur Dateiname: $fileNamewoPath"

    # Dateiname nach "-", gesplittet, zwei Teile, deswegen [1] am Ende
    # uns interessiert nur der zweite Teil
    $folderName = $fileNamewoPath.Split('-')[1]

    #Write-Host "Der Teil, der uns interessiert: $folderName"

    # Prüfen ob das Verzeichniss existiert
    if(Test-Path "$dest\$foldername") {

      Write-Host "Ordner $foldername existiert, kopiere Datei $fileNamewoPath"
      Copy-Item $file -Destination $dest\$folderName

    } else {

      Write-Host "Ordner $foldername wird erstellt, und Datei $fileNamewoPath kopiert"
      New-Item -Path $dest\$foldername -ItemType Directory | Out-Null
      Copy-Item $file -Destination $dest\$folderName

    }
  }
}


Danke dir sehr dafür. das hat mich richtig heiss gemacht auf powershell