[Batch] Move probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Ik heb een map "FILMS" die vele andere mappen met submappen bevat. Zoals bv.:
D:\FILMS\Bikini Spring Break\EPCSKGCWZCXDJEH\DVD\P2HBSB5.iso
D:\FILMS\Breaking the Girls (20122013) PAL\GRXXKDFJRZMSHHA\Movie\DVD\P2HBTG5.iso
D:\FILMS\De marathon\MW93JLNPNH8PLLK\MW93JLNPNH8PLLK.iso

In deze submappen bevinden zich ook andere bestanden (vb. ".jpg", ".txt", ...).

De bedoeling is om uiteindelijk de volgende structuur te bekomen waarbij voor elke map alle bestanden (dus niet alleen ".iso", maar ook ".jpg", ...) zich in hun tweede map bevinden namelijk in de map met de filmnaam:
D:\FILMS\Bikini Spring Break\P2HBSB5.iso
D:\FILMS\Breaking the Girls (20122013) PAL\P2HBTG5.iso
D:\FILMS\De marathon\MW93JLNPNH8PLLK.iso

Als voorbeeld nog eens één mapje van wat ik wil bekomen maar dan in mapstructuur:
D:\FILMS
------\Bikini Spring Break
-----------\P2HBSB5.iso
-----------\0001.jpg
-----------\lees.txt

Ik werk nog met Win XP.
De batch file plaats ik in de map "FILMS", en deze wordt van daaruit dus ook uitgevoerd. Het volgende heb ik al geprobeerd:
- Met "moveup1.bat" komen alle bestanden in de map "FILMS" terecht i.p.v. in de tweede map (nl. de map met hun filmnaam).
code:
for /r %%i in (*) do @move "%%i"

- Met "moveup2.bat" komen eveneens alle bestanden in de map "FILMS" terecht i.p.v. in de tweede map (nl. de map met hun filmnaam).
code:
for /r %%f in (*) do @move "%%f"

- Met "moveup3.bat" komen alle bestanden op "D:\" terecht i.p.v. in hun map met de filmnaam.
code:
for /r %%f in (*) do @move "%%f" ..\

- Met "moveup4.bat" schuiven de bestanden die zich in alle submappen bevinden één map op, alsook de bestanden die zich in de map "FILMS" bevinden. Het bat-bestand (move4.bat) dat zich dus ook in deze map bevond wordt dus ook mee één map opgeschoven en komt in "D:\" terecht.
code:
for /r %%x in (*.*) do move "%%x" "%%x"/../..

Vermits niet elke map van een film evenveel submappen heeft lijkt mij de enige manier om tot het gewenste resultaat te komen dat ik telkens de bestanden die zich in de laatste submap bevinden één map opschuif, en dit tot alle bestanden zich in de map met de filmnaam bevinden. De submappen die door het opschuiven van de bestanden leeg zijn wil ik ook automatisch verwijderen, maar dit is een zorg voor later. Als de lege mappen dan mee automatisch verwijderd worden kan ik in verkenner mee opvolgen (als ik "D:\FILMS" open) welke filmmappen nog submappen hebben, dit zijn dan de mappen waar ik de bestanden nog verder moet opschuiven tot de submappen verdwenen zijn.

Ik ben hier nu al heel de week mee aan het knoeien, op Google aan het zoeken, maar vind de oplossing niet. Ik ben geen programmeur dus de bat-bestanden begrijp ik niet helemaal. Deze zijn maar tot stand gekomen via Google en trail & error ;)

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Complexe taak voor een batchfile. Aangezien je een onbekend aantal subdirectories wilt skippen, heb je verschillende iteratieslagen nodig, of een directory parser die op zoek gaat naar de files, en ze naar de onderste directory copieert. Persoonlijk zou ik hier eerder javascript voor gebruiken, wat een volwaardige taal is. (vbscript kan ook, maar hou niet van die syntax)

Het kan wel in batch, maar je moet subroutines gebruiken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:opnieuw
del flag
for /d %%d in (*) do call :sub %%d

if exists flag goto opnieuw

goto :EOF

:sub
cd %1
for /d %%e in (*) do (
    move %%e\* .
    rmdir %%e
    echo moved %%e >>..\flag
)
cd ..
goto :EOF


Wat doet dit:
de :opnieuw (...) goto opnieuw zorgt dat de hoofdlust blijft worden herhaald zolang de file 'flag' blijft opduiken.
De lus zelf enumereert alle subdirectories en roept 'sub' aan met de directory naam als argument.

'sub' gaat de subdirectory in, en enumereert alle sub-subdiretories, moved de inhoud naar beneden, en verwijderd de sub-subdirectory. Verder zet hij de 'flag' file voor alle gevonden sub-subdirtories.

Dus zolang er sub-subdirectories bestaan zal hoofdlus blijven lopen, en worden de subboompjes van onderaf 'opgegeten'.

Niet getest, ik heb hier geen Windows systeem. Ik raad je aan om de batchfile te doorspekken met echo's om de programma flow te kunnen volgen als het niet goed werkt.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Mijzelf schreef op zaterdag 17 augustus 2013 @ 11:39:
Persoonlijk zou ik hier eerder javascriptpython voor gebruiken, wat een volwaardige taal is.
FTFY ;)

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Duh. Ja, ik ga een 50MB script interpreter + libraries installeren voor een scriptje van 30 regels, terwijl ondersteuning van javascript standaard in Windows zit sinds W95+IE4.01

Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Ik gebruik onderstaand voor oma. dan kan ze een nzbfile bij mij droppen (met een prefix"oma") en dan word het door sabnzbd opgepakt. verwerkt en naar de juiste folder gezet zodat ze het met ftp weer naar binnen kan lurken. doet ook shit moven.

dit loopt om de 5 minuten. ik weet het het is wat rudimentair, maar het werkt


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@echo ON
Set pad1=K:\Media\sabnzb
Set pad2=K:\MediaProxy\Oma
Set pad3=F:\ftp\Oma\Getnzb
Set pad4=D:\Data\sabnzbd-get

echo start move nzb to nzbget

if exist f:\ftp\edi\oma\tomoveftp.txt del /f f:\ftp\edi\oma\tomoveftp.txt
dir %pad1%\oma* %pad1%\andereprefix* /b /s >f:\ftp\edi\oma\tomoveftp.txt
if %errorlevel% == 1 goto stap1

dir %pad1%\oma* %pad1%\andereprefix* /b >f:\ftp\edi\oma\tomoveftpshort.txt
copy emailoutbound.txt+tomoveftpshort.txt+Emailend.txt sendmail.txt /a
bmail >> rec.txt -s 192.168.0.60 -t "fcc@komkommer.nl,temp@komkommer.nl" -m sendmail.txt -f "fcc@bestaatnietlala.nl" -a "Files(s) processed" -h -d

FOR /F "eol=; tokens=1* delims=," %%i in (f:\ftp\edi\oma\tomoveftp.txt) do move /y "%%i" "%pad2%"
echo end  move nzb to nzbget

:stap1
echo start move from downloaded media to proxy
if exist f:\ftp\edi\oma\tomoveftp.txt del /f f:\ftp\edi\oma\tomoveftp.txt
if exist f:\ftp\edi\oma\tomoveftpshort.txt del /f f:\ftp\edi\oma\tomoveftpshort.txt

dir %pad1%\oma* %pad1%\andereprefix* /b /s >f:\ftp\edi\oma\tomoveftp.txt
if %errorlevel% == 1 goto cleanup2

dir %pad1%\oma* %pad1%\andereprefix* /b >f:\ftp\edi\oma\tomoveftpshort.txt
copy emailinbound.txt+tomoveftpshort.txt+Emailend.txt sendmail.txt /a
bmail >> out.txt -s 192.168.0.11 -t "fcc@komkommer.nl,temp@komkommer.nl" -m sendmail.txt -f "fcc@bestaatnietlala.nl" -a "Files(s) recieved" -h -d

FOR /F "eol=; tokens=1* delims=," %%i in (f:\ftp\edi\oma\tomoveftp.txt) do move /y "%%i" "%pad4%"

cacls k:\mediaproxy\oma\*.* /E /T /P ftp:F

:cleanup2
if exist d:\ftp\edi\oma\tomoveftp.txt del /f f:\ftp\edi\oma\tomoveftp.txt
if exist d:\ftp\edi\oma\tomoveftpshort.txt del /f f:\ftp\edi\oma\tomoveftpshort.txt
if exist d:\ftp\edi\oma\sendmail.txt del /f f:\ftp\edi\oma\sendmail.txt

rem exit

Iperf


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Mijzelf schreef op zaterdag 17 augustus 2013 @ 12:44:
Duh. Ja, ik ga een 50MB script interpreter + libraries installeren voor een scriptje van 30 regels, terwijl ondersteuning van javascript standaard in Windows zit sinds W95+IE4.01
Is ook wel een dagtaak inderdaad ;)

Acties:
  • 0 Henk 'm!

  • spone
  • Registratie: Mei 2002
  • Niet online
offtopic:
Ben je niet in de war met JScript danwel VBScript? Voor zover ik weet leeft (iig onder Windows) Javascript alleen binnen browserachtige dingen.

edit: @hieronder. Ik heb het even nagezocht en het lijkt erop dat JScript de Microsoft-versie van ECMAScript is waar JavaScript de Netscape-versie is. JScript mocht geen JavaScript heten vanwege copyrightdingen. JScript draait in feite in een browser en kan ActiveX dingen aanroepen, zoals het hieronder aangehaalde new ActiveXObject().

[ Voor 52% gewijzigd door spone op 17-08-2013 16:30 ]

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
@spone: Ik moet zeggen dat ik het verschil tussen javascript en JScript niet zou weten. Het is mogelijk dat het een in een browser draait (hoewel, zou dat dan geen ECMAscript zijn?) en het andere niet, maar IE gebruikt wel de zelfde engine als cscript.exe of wscript.exe.
Als je een bestand maakt met een .js extensie wordt hij standaard door wscript.exe uitgevoerd.

Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Mijzelf schreef op zaterdag 17 augustus 2013 @ 11:39:
Complexe taak voor een batchfile. Aangezien je een onbekend aantal subdirectories wilt skippen, heb je verschillende iteratieslagen nodig, of een directory parser die op zoek gaat naar de files, en ze naar de onderste directory copieert. Persoonlijk zou ik hier eerder javascript voor gebruiken, wat een volwaardige taal is. (vbscript kan ook, maar hou niet van die syntax)

Het kan wel in batch, maar je moet subroutines gebruiken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:opnieuw
del flag
for /d %%d in (*) do call :sub %%d

if exists flag goto opnieuw

goto :EOF

:sub
cd %1
for /d %%e in (*) do (
    move %%e\* .
    rmdir %%e
    echo moved %%e >>..\flag
)
cd ..
goto :EOF


Wat doet dit:
de :opnieuw (...) goto opnieuw zorgt dat de hoofdlust blijft worden herhaald zolang de file 'flag' blijft opduiken.
De lus zelf enumereert alle subdirectories en roept 'sub' aan met de directory naam als argument.

'sub' gaat de subdirectory in, en enumereert alle sub-subdiretories, moved de inhoud naar beneden, en verwijderd de sub-subdirectory. Verder zet hij de 'flag' file voor alle gevonden sub-subdirtories.

Dus zolang er sub-subdirectories bestaan zal hoofdlus blijven lopen, en worden de subboompjes van onderaf 'opgegeten'.

Niet getest, ik heb hier geen Windows systeem. Ik raad je aan om de batchfile te doorspekken met echo's om de programma flow te kunnen volgen als het niet goed werkt.
Al bedankt voor de moeite, spijtig genoeg werkt het niet.
Ik had als test even een map bij aangemaakt in de map "FILMS" en hier 2 films in geplaatst:
D:\FILMS\MOVIE COLLECTOR TEST\Bikini Spring Break\EPCSKGCWZCXDJEH\DVD\P2HBSB5.iso
D:\FILMS\MOVIE COLLECTOR TEST\Breaking the Girls (20122013) PAL\GRXXKDFJRZMSHHA\Movie\DVD\P2HBTG5.iso

Het bat bestand had ik in de map "MOVIE COLLECTOR TEST" geplaatst.
Er gebeurde niets met de mappen en bestanden in de "MOVIE COLLECTOR TEST" map, wat wel gebeurde is dat er in de bovenliggende map "FILMS" met de bestanden gerommeld werd.

Is in javascript zoiets makkelijker toe te passen? En als dit standaard dan toch in Windows uit te voeren is ...
fish schreef op zaterdag 17 augustus 2013 @ 12:56:
Ik gebruik onderstaand voor oma. dan kan ze een nzbfile bij mij droppen (met een prefix"oma") en dan word het door sabnzbd opgepakt. verwerkt en naar de juiste folder gezet zodat ze het met ftp weer naar binnen kan lurken. doet ook shit moven.

dit loopt om de 5 minuten. ik weet het het is wat rudimentair, maar het werkt

.....
Die code gaat mij niet verder kunnen helpen met mijn probleem denk ik. ;)

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
buffy1966 schreef op zaterdag 17 augustus 2013 @ 13:56:
[...]

spijtig genoeg werkt het niet.
Tja. Dan moet je wat echo's invoegen om te kijken wat hij doet.
Is in javascript zoiets makkelijker toe te passen? En als dit standaard dan toch in Windows uit te voeren is ...
Ik vind het makkelijker. In ieder geval is het leesbaarder.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var fso = new ActiveXObject("Scripting.FileSystemObject");

function ParseSubSubDir( dir, subdir )
{
    var dirobj = fso.GetFolder( subdir );
    
    var fc = new Enumerator(dirobj.SubFolders);
    for (; !fc.atEnd(); fc.moveNext())
    {
        var subsubdir = subdir + "\\" + fc.item();
        ParseSubSubDir( dir, subsubdir ); 
    }

    fc = new Enumerator(dirobj.files);
    for (; !fc.atEnd(); fc.moveNext())
    {
        fc.Move( dir );
    }
}

function ParseSubDir( dir )
{
    var dirobj = fso.GetFolder( dir );
    
    var fc = new Enumerator(dirobj.SubFolders);
    for (; !fc.atEnd(); fc.moveNext())
    {
        var subdir = dir + "\\" + fc.item();
        ParseSubSubDir( dir, subdir ); 
        fso.DeleteFolder( subdir );
    }
}


function ParseDir( dir )
{
    var dirobj = fso.GetFolder( dir );
    
    var fc = new Enumerator(dirobj.SubFolders);
    for (; !fc.atEnd(); fc.moveNext())
    {
        ParseSubDir( dir + "\\" + fc.item() ); 
    }
}

ParseDir( "D:\\Films" );
Opnieuw, niet getest. Heb geen Windows systeem.

Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Ik heb je code in kladblok gezet en opgeslagen als "moveup.js".
Dan heb ik volgende code ook in kladblok gezet en opgeslagen als "index.html".
code:
1
<script type="text/javascript" src="moveup.js"></script>


Weet niet of dit juist is, heb dit gegoogled.
Beide bestanden heb ik in dezelfde map gezet.
Er gebeurd niets, dus waarschijnlijk doe ik iets mis.

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Je kunt moveup.js uitvoeren door erop te dubbelklikken.

Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Heb ik ook geprobeerd. Bij mij opent dan Dreamweaver dit bestand.

Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

buffy1966 schreef op zaterdag 17 augustus 2013 @ 13:56:
...]

Die code gaat mij niet verder kunnen helpen met mijn probleem denk ik. ;)
huh, ik denk het wel }:|

Iperf


Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Het zou kunnen, maar voor mij is het wat chinees :?
Wat ik bedoelde was feitelijk dat als ik lees wat jij allemaal met die code doet dit voor mij niet nodig is denk ik. Waarschijnlijk moet er ergens een stuk van de code uitgehaald worden maar ik zou niet weten welk stuk. Dat bedoelde ik met dat dit mij niet verder kan helpen. Ik waardeer natuurlijk wel de hulp die je aanbiedt.

Acties:
  • 0 Henk 'm!

  • buffy1966
  • Registratie: December 2005
  • Laatst online: 05-09 15:09
Ondertussen heb ik ook code gevonden die misschien doet wat ik wil. Ik moet dit nog wel even verder testen.
Zou volgende code zijn:
code:
1
2
3
4
5
6
7
8
9
@echo off
 pushd "d:\films"
    for /f "delims=" %%a in (' dir /ad /b ') do (
       pushd "%%a"
         for /r %%b in (*) do move /-y "%%b" . 
         for /f "delims=" %%c in (' dir /b /s /ad ^|sort /r') do rd "%%c" 2>nul
       popd
    )
 popd

Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Simpel.


regel 25 maak een todo lijstje voor de move. (in dit geval een iets selctievere dir) maar dat kan ook * zijn
regel 26 skipt naar verder als de lijst leeg is (einde in jouw geval)
regel 32 doet de move voor alle entrys in het lijstje
regel 37 tieft het lijstje weg

die paden worden boven gefefineert. maar kunnen ook in het commando

[ Voor 11% gewijzigd door Fish op 18-08-2013 00:55 ]

Iperf


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
buffy1966 schreef op zaterdag 17 augustus 2013 @ 23:42:
Heb ik ook geprobeerd. Bij mij opent dan Dreamweaver dit bestand.
Tja. Rechtsklikken->Uitvoeren?
Rechtsklikken->Openen met->Scriptinterpreter?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TheVMaster
  • Registratie: Juli 2001
  • Laatst online: 18:26

TheVMaster

Moderator WOS
Mijzelf schreef op zaterdag 17 augustus 2013 @ 12:44:
Duh. Ja, ik ga een 50MB script interpreter + libraries installeren voor een scriptje van 30 regels, terwijl ondersteuning van javascript standaard in Windows zit sinds W95+IE4.01
Waarom geen PowerShell (of desnoods VBscript) aangezien dat toch de twee talen zijn die gewoon Windows native zijn waarbij PowerShell het minst complex is, in ieder geval minder complex dan Javascript volgens mij.

Overigens is dit standaard in Windows XP helaas niet aanwezig, maar PowerShell v1 kun je gewoon installeren binnen Windows XP
Pagina: 1