Willkommen im cgboard - classic games Forum! Deine gemütliche Retro Gaming Community. Besuche uns auch im Discord Chat.

[Frage] Batch Scripting Dateien verschieben
#1
0
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
Zitieren
#2
0
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?
Zitieren
#3
0
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
Zitieren
#4
1
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
Zitieren
#5
1
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.
Zitieren
#6
0
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.
Zitieren
#7
1
(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.
[Bild: banner_cool3zhjth.jpg]
Zitieren
#8
1
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.
Zitieren
#9
0
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
Zitieren
#10
0
Wozu die Liste?

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

Oder verstehe ich was falsch?
Zitieren
#11
0
(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
Zitieren
#12
1
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.
Zitieren
#13
1
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

    }
  }
}
[Bild: banner_cool3zhjth.jpg]
Zitieren
#14
0
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?
Zitieren
#15
0
(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.
[Bild: banner_cool3zhjth.jpg]
Zitieren
#16
0
... dem ist nix mehr hinzuzufügen :-)

Sehe ich auch so.
Zitieren
#17
0
Danke für die vielen zahlreichen tips. Bin grade wieder nach Hause gekommen
und werde gleich alles mal durchlesen und umsetzten.
Zitieren
#18
0
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
Zitieren
#19
1
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...
Zitieren
#20
0
(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
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  SWF-Dateien abspielen? Atreyu 16 1.630 17.05.2023, 08:18
Letzter Beitrag: Juttar
  [Suche] Ordner nach Dateinamen erstellen und automatisch verschieben kolwe-x 5 604 20.11.2022, 12:16
Letzter Beitrag: donald
  [Frage] Mehrere .bin umwandeln (automatisiert|Batch) kolwe-x 34 15.392 06.05.2019, 23:27
Letzter Beitrag: SagaraS
  [Frage] C64 SEQ Dateien lexcom 2 2.461 26.06.2018, 23:29
Letzter Beitrag: lexcom
  [Grafik] Bräuchte mal eine kleine Hilfe für ein Dekompression Algorithmus für ILBM Bild Dateien SagaraS 7 3.715 14.12.2017, 18:30
Letzter Beitrag: tomwatayan

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste