mistax
Goto Top

Zufallsverschiebung

Hallo,

ich habe hier im Forum von Biber schon ein Script gefunden, was das macht, was ich möchte.
Ich habe es jetzt angepasst und es funktioniert fast... Aber jetzt komme ich nichtmehr weiter - eventuell weiss jmd. von euch weiter?

set "path=c:\batch\"  


setlocal EnableDelayedExpansion
echo Setting Target and Source
Set "quell=%path%\Pool" & set "target=%path%\Play"  

echo Calculating max. Files in Directory
Set /a "max=0, lfdnr=0"  
for /f %%i in ('dir /b /a:-d %quell%') do set /a "max+=1"  
echo Files in Directory: %max%
if %max%==0 goto empty
if %max%==1 move "%path%\Pool\*.mpg" "%path%\Play\" & goto end  

echo Randomize
:Again
For %%i in (f_1) do set /a "%%i=!random!%%%max%"  

echo Executing
for /f %%i in ('dir /b /a:-d %quell%') do (  
  set /a "lfdnr+=1"  
  @for %%a in (%f_1%) do (
   if %%a==!lfdnr! move %quell%\%%~nxi %target%
))

goto end

:empty
echo Verzeichnis leer
pause

:end


Ich habe Ordner Pool und Ordner Play

Im Ordner Pool sind X .mpg Files vorhanden, die nacheinander in zufälliger Reihenfolge in den Ordner Play verschoben werden sollen, bis keine mehr in Pool sind.

Bei jedem Ausführen der .bat soll eine Datei verschoben werden.

Probleme:

- Die letzte Datei wird nie verschoben, habe deswegen diese Zeile eingefügt:
if %max%==1 move "%path%\Pool\*.mpg" "%path%\Play\" & goto end  
geht aber sicherlich auch noch eleganter, oder?

- Manchmal macht die .bat garnichts, obwohl noch Dateien da sind - wieso? Dies ist mittlerweile mein größtes Problem.

danke!

Content-ID: 80975

Url: https://administrator.de/contentid/80975

Ausgedruckt am: 14.11.2024 um 07:11 Uhr

Biber
Biber 18.02.2008 um 07:27:58 Uhr
Goto Top
Moin MISTAX,

versuche es im ersten Anlauf mal so:

@echo off & setlocal EnableDelayedExpansion
REM hier: Kollisionen mit der "globalen" %path%-Variable vermeiden  
REM Mindestens sollte das "set path=.." innerhalb der Setlocal-Anweisung  
REM Besser noch, der hier benutzte Pfad heißt %mypath%" oder %pfad%   
set "MYpath=c:\batch\"  
echo Setting Target and Source
Set "quell=%MYpath%\Pool" & set "target=%MYpath%\Play"  

echo Calculating max. Files in Directory
Set /a "max=0, lfdnr=0"  
for /f %%i in ('dir /b /a:-d %quell%\*.mpg') do set /a "max+=1"  
echo Files in Directory: %max%
if %max%==0 goto empty
REM if %max%==1 move "%path%\Pool\*.mpg" "%path%\Play\" & goto end  

echo Randomize
:Again
REM For %%i in (f_1) do set /a "%%i=!random!%%%max%"  
set /a "f_1=%random% %% max"  
Echo [DEBUG] f_1 ist [%f_1%] und max ist [%max%]
echo Executing
for /f %%i in ('dir /b /a:-d %quell%\*.mpg') do (  
  set /a "lfdnr+=1"  
   if %f_1%==!lfdnr! (
       Echo [DEBUG] verschiebe Datei No. [%f_1%] --  und zwar [%%~nxi]
       ECHO move %quell%\%%~nxi %target%
))

goto end

:empty
echo Verzeichnis leer
pause

:end

So lässt sich die Batch erstmal testen.
Dann schauen wir weiter.

Grüße
Biber
Biber
Biber 20.02.2008 um 19:47:49 Uhr
Goto Top
Hallo MISTAX,

gibt es irgendwas, was wir hier im Forum wissen sollten?

Grüße
Biber
MISTAX
MISTAX 20.02.2008 um 20:00:23 Uhr
Goto Top
Hallo Biber,

vielen Dank für deine sehr schnelle Antwort - in einem ersten paste-copy-execute Schnelltest, hat sich das Fenster sofort wieder geschlossen und nichts ist passiert (wie bei einem falschen goto Verweis)

Leider habe ich kurzfristig Arbeit aufgedrückt bekommen, so dass ich vor dem WE nicht zu weiteren Tests komme.
Ich bedanke mich für die freundliche Hilfe, bitte aber noch um etwas Geduld, bis ich eine sinnvolle Antwort posten kann.

Grüße
Martin
MISTAX
MISTAX 26.02.2008 um 00:01:51 Uhr
Goto Top
Also, ich hab jetzt etwas getestet, bis zur for-Schleife (executing) kommt er, danach fliegt er raus - sprich die batch wird beendet, nichts passiert.


@echo off & setlocal EnableDelayedExpansion


echo Setting Target and Source
set "MYpath=c:\batch"  
Set "quell=%MYpath%\Pool\" & set "target=%MYpath%\Play\"  


echo Calculating max. Files in Directory
Set /a "max=0, lfdnr=0"  
for /f %%i in ('dir /b /a:-d %quell%\*.mpg') do set /a "max+=1"  
echo Files in Directory: %max%
if %max%==0 goto empty


echo Randomize
set /a "f_1=%random% %% max"  
Echo [DEBUG] f_1 ist [%f_1%] und max ist [%max%]


echo Executing
for /f %%i in ('dir /b /a:-d %quell%*.mpg') do (  
  set /a "lfdnr+=1"  
   if %f_1%==!lfdnr! (
       Echo [DEBUG] verschiebe Datei No. [%f_1] --  und zwar [%%~nxi]
       ECHO move %quell%\%%~nxi %target%
))
goto end

:empty
echo Verzeichnis leer
pause

:end
pause
Biber
Biber 26.02.2008 um 10:34:35 Uhr
Goto Top
Moin MISTAX,

sorry, sehe mit bloßem Auge keinen Fehler. Bzw. nur einen nicht entscheidenden.
---> Hier fehlt ein "%" nach der Variablen:
JETZT: Echo [DEBUG] verschiebe Datei No. [%f_1] -- und zwar [%%~nxi]
BESSER: Echo [DEBUG] verschiebe Datei No. [%f_1%] -- und zwar [%%~nxi]


Was gibt denn die Zeile aus
Echo [DEBUG] f_1 ist [%f_1%] und max ist [%max%]

Grüße
Biber
MISTAX
MISTAX 26.02.2008 um 16:56:11 Uhr
Goto Top
Ich sehe gerade, dass ich wohl nicht oft genug getestet habe... Oft kommt:

Echo [DEBUG] f_1 ist  und max ist [6]

Dann passiert garnichts; batch geth wieder zu.


Wenn man es aber oft genug probiert kommt irgendwann auch mal


Echo [DEBUG] f_1 ist [6> X <0] und max ist [6]

Dann bekomme ich auch eine erfolgreiche Debug-Echo


Sprich, wenn f_1 = 0 ist gibt's nen Fehler, sonst funktioniert's
Biber
Biber 26.02.2008 um 18:02:25 Uhr
Goto Top
Sorry, MISTAX,

da habe ich aber auch genüßlich mitgeschnarcht.... face-wink

Logisch, die (Zufallszahl Mod Oberkante) muss natürlich um Eins erhöht werden....
Also bitte diese Zeile ändern:
set /a "f_1=%random% %% max +1"

Biber,
der doch lieber hätte Bäcker werden sollen
MISTAX
MISTAX 26.02.2008 um 23:36:31 Uhr
Goto Top
Super - jetzt funktioniert es einwandfrei... hier die ganze Lösung:

@echo off & setlocal EnableDelayedExpansion

:PREPARATION
set "MYpath=C:\batch"  

echo Resetting Play-Folder
move "%MYpath%\Play\*.mpg" "%MYpath%\Pool\Used\"  
if errorlevel 1 goto Filelock


:DECISSION
echo Setting Target and Source
Set "quell=%MYpath%\Pool\" & set "target=%MYpath%\Play\"  

echo Calculating max. Files in Directory
Set /a "max=0, lfdnr=0"  
for /f %%i in ('dir /b /a:-d %quell%\*.mpg') do set /a "max+=1"  
echo Files in Directory: %max%
if %max%==0 goto empty

echo %max% Files available

echo Randomize
set /a "f_1=%random% %% max +1"  

echo Move to Play-Folder

for /f %%i in ('dir /b /a:-d %quell%*.mpg') do (  
  set /a "lfdnr+=1"  
   if %f_1%==!lfdnr! (
       Echo Moving File No. [%f_1%] which is [%%~nxi]
       move %quell%%%~nxi %target%
       set "playfile=%%~nxi"  
))
goto end


:EMPTY
echo Folder is empty
echo Recreating library
move "%MYpath%\Pool\Used\*.mpg" "%MYpath%\Pool\"   
goto DECISSION


:Filelock
echo File locked, process stopped
pause


:end


Es ist immer nur eine Datei im Play-Folder; die wird vor jedem neuen Vorgang nach "Used" verschoben. Sobald im Pool keine Dateien mehr sind, beginnt das Ganze von Vorne.

Vielen Dank lieber Biber!


P.S. gibt es eigentlich die Möglichkeit per batch herrauszufinden, wielang eine MPG-Datei ist? -> besser ein neues Thema aufmachen, oder?