Det kører næsten som det skal. Den kopiere også mapperne over, den skal den ikke. Den skal finde alle jpg-filer og kopiere alle disse over i en mappe (uden mapper).
nemlig.. copy er simpel.. han skal have kopieret nogle filer.. de behøver ikke at være kønt, bare funktionelt.. copy klarer opgaven.. mht. at copy har meget få muligheder, kan jeg kun give dig ret i.. men "få" muligheder indkluderer den opgave som copy egentligt skulle gøre.. at kopierer filer..
1. alle jpg-filer fra den pågældende mappe skal kopieres! 2. alle undermapper skal gennemløbes og alle jpg-filer skal kopieres? 3. undermapperne skal ikke kopieres med. Det er kun indholdet af dem? 4. Har undermapperne faste navne eller varierer de fra dag-til-dag?
Jeg har lavet følgende, der burde kunne det du vil. Hvis der er to filer der heddder det samme, f.ex one.jpg vil den første kommme til at hedde one.jpg og den anden one1.jpg:
@echo off setlocal if [%1]==[] echo "You Must specify a Destination"& goto :eof if [%2]==[] call :Process "%1" *.*& goto :eof
:Process for /F "delims=;" %%A in ('dir /B /S /A-D %2') do call :CopyIt "%%~dpA" "%%~nA" "%%~xA" %1 goto :eof
:CopyIt set xxx= :TryAgain if exist %~4\%~2%xxx%%~3 set /A xxx+=1&goto TryAgain copy %~1%~2%~3 %~4\%~2%xxx%%~3 >nul 2>&1
Du putter ovenstående i en bat-fil (f.ex mycopy.bat) og kører det på denne måde: mycopy dest [ext1 [ext2]]
hvor dest er destinationen og ext1 (og ext2) er de ekstensions du vil have kopieret, dest kan f.ex være d:\backup og ext1 kan være *.jpg. Hvis du ikke angiver nogen extension vil alle filer blive kopieret. Dest må IKKE være en undermappe af den mappe hvorfra du kopierer, ellers vil du komme til at køre i en uendelig løkke.
Så gemmer du filen i enten den mappe hvorfra du vil kopiere eller en mappe der er i din path (f.ex c:\winnt\system, skriv path i en dos-prompt for as hvilke mapper der er i din path). Dernæst stiller du dig i den mappe du vil kopiere fra (dvs åbner en dos-prompt og bruger cd \xxx\yy) og til slut kalder du bat-filen som beskrevet ovenfor.
Jeg skriver mycopy.bat "D:\billeder" *.jpg i cmd. Der sker ikke noget i et par minutter og derefter kører den alle filer igennem, men skriver også "Den angivet fil blev ikke fundet"
Jeg har lavet en version hvor man angiver source dir som første parameter, man kan bruge . til at angive nuværende dir. Denne version vil checke om destinations mappen eksisterer, hvis den ikke gør det bliver man spurgt om den skal laves. Dette er versionen der giver filer med samme navn fortløbende numre, en version der ikke overskriver eksisterende filer følger. Så brugen er: mycopy.bat source dest [ext1 [ext2 [...]]]
@echo off setlocal if [%1]==[] echo You Must specify a Source & goto :eof if [%2]==[] echo You Must specify a Destination & goto :eof set SourcePath="%1" set DestPath="%2" if not exist %DestPath:"=%\. call :CheckDest if not exist %DestPath:"=%\. goto :EOF
:Process for /F "delims=;" %%A in ('dir /B /S /A-D %SourcePath:"=%\%1') do call :CopyIt "%%~dpA" "%%~nA" "%%~xA" goto :eof
:CopyIt set xxx= :TryAgain if exist %DestPath:"=%\%~2%xxx%%~3 set /A xxx+=1&goto TryAgain copy %~1%~2%~3 %DestPath:"=%\%~2%xxx%%~3 >nul 2>&1 goto :eof
:CheckDest set /P Answer=%DestPath:"=% Does not exist, do you want to create it? if [%Answer%]==[n] ( echo I can't copy any files then! goto :eof ) else ( MD %DestPath:"=% if not exist %DestPath:"=%\. echo Failed to Create %DestPath:"=% )
En version der ikke overskriver eksisterende filer:
@echo off setlocal if [%1]==[] echo You Must specify a Source & goto :eof if [%2]==[] echo You Must specify a Destination & goto :eof set SourcePath="%1" set DestPath="%2" if not exist %DestPath:"=%\. call :CheckDest if not exist %DestPath:"=%\. goto :EOF
:CheckDest set /P Answer=%DestPath:"=% Does not exist, do you want to create it? if [%Answer%]==[n] ( echo I can't copy any files then! Goto :eof ) else ( MD %DestPath:"=% if not exist %DestPath:"=%\. echo Failed to Create %DestPath:"=% )
Bare for at besværlig, kunne man ikke samle det to bat-filer til et bat-fil? Kan man ikke gøre det sådan, at man ikke behøver at kalde bat-filen ude fra cmd, bare køre bat-filen og indtaste de oplysninger der skal bruges:
Source Destination Giver filer med samme navn fortløbende numre Kopierer kun en fil hvis der er flere der har samme navn samt valg af de ekstensions man vil bruge
Det er kun hvis du har tid og lyst, for ellers kan jeg sagtens bruge de bat-filer du allerede har lavet.
@echo off setlocal set /P SourcePath="Enter source path: " set /P DestPath="Enter destination path: " if not exist %DestPath:"=%\. call :CheckDest if not exist %DestPath:"=%\. goto :EOF set /P Renumber="Should files with same name be numbered: "
:Next set Ext= set /P Ext="Enter extension (Enter to quit): " if [%Ext%]==[] goto :eof call :Process %ext% goto :Next
:Process for /F "delims=;" %%A in ('dir /B /S /A-D %SourcePath:"=%\%1') do call :CopyIt "%%~dpA" "%%~nA" "%%~xA" goto :eof
:CopyIt if [%Renumber%]==[n] goto NoRenumber set xxx= :TryAgain if exist %DestPath:"=%\%~2%xxx%%~3 set /A xxx+=1&goto TryAgain copy %~1%~2%~3 %DestPath:"=%\%~2%xxx%%~3 >nul 2>&1 goto :eof
:CheckDest set /P Answer=%DestPath:"=% Does not exist, do you want to create it? if [%Answer%]==[n] ( echo I can't copy any files then! Goto :eof ) else ( MD %DestPath:"=% if not exist %DestPath:"=%\. echo Failed to Create %DestPath:"=% )
Ud for "Should files with same name be numbered" skriver man n hvis man ikke ønsker at give filer der hedder det samme fortløbende numre, og noget andet ellers. Jeg kan godt lave det som valg mellem 1 og 2.
Den kører i en løkke og spørger efter extension, så skriver du EN ektension (f.ex *.jpg) og trykker enter, så kopierer den alle jpg-file og spørger igen, hvorpå du skriver *.gif, osv. Til slut trykker du blot på enter for at få den til at stoppe.
Nu har jeg fået det til at køre. Nu når du alligevel skal rette i bat-filen, kan du så lave en tekst der siger "kopiere filer", når bat-filen begynder at kopiere. Evt. tilføje en log-fil.
Hvad kan man med extension? Sortere efter filtyper og ....? Kan man sortere efter størrelse?
Jeg har ændret indtastning af valg som foreslået. Nu udskriver den hvad der kopieres f.ex "Copying .\*.txt to d:\ll" og antallet af filer der er kopieret. Man kan godt lave en logfil med f.ex en liste over hvad der kopieret og resultatet. Man kan godt kopiere filer der er over/under en eller anden størrelse, ældre/yngre end en dato, gemt på en lørdag, lavet en bestemt tidspunkt på dagen, osv. Men hvis det er det du ønsker synes jeg at du selv skal begynde at kode lidt, så skal jeg nok hjælpe hvis du har problemer.
@echo off setlocal set /P SourcePath="Enter source path: " set /P DestPath="Enter destination path: " if not exist %DestPath:"=%\. call :CheckDest if not exist %DestPath:"=%\. goto :EOF
set Renumber= :select echo Select what to do with files with the same name echo 1 to append consecutive numbers echo 2 to ignore set /P Renumber="Select> " if {%renumber%}=={1} goto :next if {%renumber%}=={2} goto :next goto :select
:Next set Ext= set NumFiles=0 set /P Ext="Enter extension (Enter to quit): " if [%Ext%]==[] goto :eof echo Copying %SourcePath%\%ext% to %DestPath% call :Process %ext% echo Copied %NumFiles% files goto :Next
:Process for /F "delims=;" %%A in ('dir /B /S /A-D %SourcePath:"=%\%1') do call :CopyIt "%%~dpA" "%%~nA" "%%~xA" goto :eof
:CopyIt if [%Renumber%]==[n] goto NoRenumber set xxx= :TryAgain if exist %DestPath:"=%\%~2%xxx%%~3 set /A xxx+=1&goto TryAgain for /F %%A in ('copy %~1%~2%~3 %DestPath:"=%\%~2%xxx%%~3') do set /A NumFiles+=%%A goto :eof
:NoRenumber if exist %DestPath:"=%\%~2%~3 goto :eof for /F %%A in ('copy %~1%~2%~3 %DestPath:"=%\%~2%~3') do set /A NumFiles+=%%A goto :eof
:CheckDest set /P Answer=%DestPath:"=% Does not exist, do you want to create it? if [%Answer%]==[n] ( echo I can't copy any files then! Goto :eof ) else ( MD %DestPath:"=% if not exist %DestPath:"=%\. echo Failed to Create %DestPath:"=% )
Jeg tror det som driller engang imellem er, hvordan jeg skal indtaste source path og destination path. Er det bare drevangivelse, kan jeg pege på en mappe og skal jeg bruge ""?
Jeg tror, hvis der skal laves log-fil eller andet andet på denne bat-fil, må du meget gerne lave det, da jeg ikke helt er inde i hvordan du gør.
Jeg vil meget gerne lave lidt kode, så kan du ikke lige gennemgå bat-fil, hvad de forskellige kommandoer gør og hvordan du har bygget det op!
Jeg har faktisk ikke tid til at skrive nu her, da jeg har lektier op over begge ører, men kunne vi ikke aftale om ca. 2 uger, (skulle være færdig med de fleste opgaver) at du hjælpe mig med at lave en bat-fil?
Bare en simpel bat-fil, så jeg lærer det grundlæggende og derefter kan bygge lidt mere på. F.eks. kunne det bare være en bat-fil som kopiere fra en mappe til en anden.
Det var et par fejl der gjorde at det ikke virkede med "", disse skulle være løst nu. (Mellemrum i stier og filnavne er "a pain in the arse" når man laver bat-scripts.) Når man kopierer et helt drev skal det angives som x: (og ikke x:\)
@echo off setlocal set /P SourcePath="Enter source path: " set /P DestPath="Enter destination path: " if not exist "%DestPath:"=%\." call :CheckDest if not exist "%DestPath:"=%\." goto :EOF
set Renumber= :select echo Select what to do with files with the same name echo 1 to append consecutive numbers echo 2 to ignore set /P Renumber="Select> " if {%renumber%}=={1} goto :next if {%renumber%}=={2} goto :next goto :select
:Next set Ext= set NumFiles=0 set /P Ext="Enter extension (Enter to quit): " if [%Ext%]==[] goto :eof echo Copying "%SourcePath:"=%\%ext%" to %DestPath% call :Process %ext% echo Copied %NumFiles% files goto :Next
:Process for /F "delims=;" %%A in ('dir /B /S /A-D "%SourcePath:"=%\%1"') do call :CopyIt "%%~dpA" "%%~nA" "%%~xA" goto :eof
:CopyIt if [%Renumber%]==[n] goto NoRenumber set xxx= :TryAgain if exist "%DestPath:"=%\%~2%xxx%%~3" set /A xxx+=1&goto TryAgain for /F %%A in ('copy "%~1%~2%~3" "%DestPath:"=%\%~2%xxx%%~3"') do ( if [%%A]==[0] echo Failed to copy "%~1%~2%~3" to "%DestPath:"=%\%~2%xxx%%~3" set /A NumFiles+=%%A )
goto :eof
:NoRenumber if exist "%DestPath:"=%\%~2%~3" goto :eof for /F %%A in ('copy "%~1%~2%~3" "%DestPath:"=%\%~2%~3"') do ( if [%%A]==[0] echo Failed to copy "%~1%~2%~3" to "%DestPath:"=%\%~2%~3" set /A NumFiles+=%%A ) goto :eof
:CheckDest set /P Answer=%DestPath:"=% Does not exist, do you want to create it? if [%Answer%]==[n] ( echo I can't copy any files then! Goto :eof ) else ( MD %DestPath% if not exist "%DestPath:"=%\." echo Failed to Create %DestPath:"=% )
bertelbrander<<Kan du ikke oprette et svar, så du kan få nogle point?
Ja, det virker lidt bedre :-)
Nu har jeg fået kopieret alle filerne over i en ny mappe, men til min store overraskelse, se jeg at der er en del filer som er de samme (f.eks. billede.jpg, men der er også en fil som hedder billede1.jpg). Hvad gør jeg?
Desværre har jeg slettet de mapper som billeder lå i, da jeg ellers ikke havde plads på min harddisk.
Kan man ikke få bat-filen til sortere nogen at disse filer fra? Filerne er jo de samme og hedder næsten det samme.
Kan du ikke bare skrive, hvad jeg skal og hvor jeg evt. skal rette i bat-filen.
Jeg har lavet et lille script der sammenligner alle filer i den mappe det er startet fra. Som det er nu udskriver det hvilke filer der er de samme, bemærk at alle filer vil blive sammelignet to gange, så der vil komme til at stå at bip.jpg er det samme som bip2.jpg og at bip2.jpg er det sammme som bip.jpg. Hvis din windows ikke er en engelsk win2k skal du måske udskifte strengen efter findstr til det, din version af fc udskriver når den har sammenlignet to ens filer. Når du har set at scriptet kører som det skal (dvs korrekt fortæller hvilke filer der er de samme) kan du tilføje en del %1 i bunden. Det tager temmelig lang tid at lave sammenligningen. Jeg forsøger, så vidt det er muligt, at undgå at få point.
@echo off for %%A in (*) do call :First "%%A" %%~zA goto :eof
:First for %%A in (*) do call :compare "%%A" %1 %%~zA %2 goto:eof
:compare if [%1]==[%2] goto :eof if NOT [%3]==[%4] goto :eof fc /B %1 %2 |findstr "no differences encountered" >nul if errorlevel 1 goto :eof echo %1 and %2 is the same file
Skal jeg bare sætte det sidste kode ind i bunden af bat-filen? Ellers prøver jeg at kigge på det i morgen.
Ved at skrive help fc får jeg dette:
Sammenligner to filer eller s‘t af filer og viser forskellene mellem dem.
FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/U] [/W] [/nnnn] [drev1:][sti1]filnavn1 [drev2:][sti2]filnavn2 FC /B [drev1:][sti1]filnavn1 [drev2:][sti2]filnavn2
/A Viser kun f›rste og sidste linje for hvert omr†de med forskelle. /B Foretager bin‘r sammenligning. /C Skelner IKKE mellem store og sm† bogstaver. /L Sammenligner filer som ASCII-tekst. /LBn Angiver det maksimale antal sammenh‘ngende uoverensstemmelser til det angivne antal linjer. /N: Viser linjenumrene ved ASCII-sammenligning. /T Udvider ikke tabulatorer til mellemrum. /U Sammenligner filer som UNICODE-tekstfiler. /W Komprimerer blanktegn (mellemrum og tabulatorer) for sammenligning. /nnnn Angiver antallet af sammenh‘ngende linjer, der skal passe efter en uoverensstemmelse.
Den seneste kode skal køre for sig selv i sin egen fil. For at få det til at virke på en dansk win2k skal du have to filer der er helt ens og så køre "fc /B fil.1 fil.2" og studere output. På min PC skriver den: Comparing files fil.1 and fil.2 FC: no differences encountered Det du skal bruge er det den skriver efter FC: i sidste linie, det putter du ind efter findstr inden for et sæt ""
Okay, jeg retter "no differences encountered" til "Ingen forskelle fundet".
Hvis den sidste kode, skal puttes i sin egen fil, så forstår jeg ikke hvordan jeg skal bruge den?
Kan man ikke integrere den sidste kode i vores bat-fil?
Jeg tænkte på, om vi ikke kunne bygge en bat-fil op fra starten? Så kunne du lave mig lidt om opbygget af et script og hvordan de forskellige kommandoer virker.
Idéer har jeg nok af, så det bliver ikke kedeligt. Det kunne også være dejligt at jeg selv kunne lave nogen bat-filer.
Jeg vidste ikke, at der er så mange muligheder med bat-filer.
Jeg tænker lige over, hvad jeg der kunne være gode idéer til en ny bat-fil. Så må du lige sige, om det er noget som er muligt at lave.
Du bruger den sidste kode ved at kalde det i den mappe hvorfra du vil have fjernet dubletter. Der skal ikke angives parametre. Man kan godt kombinere de to scripts, det kunne være en øvelse når du har fået lidt mere styr på bat programmering, indtil da vil jeg foreslå at vi beholder de to scripts seperat (så slipper jeg for arbejdet :-)).
Du kunne starte med at lave en bat fil der beregner hvor mange bytes der er i en mappe, uden at bruge dir.
Så kunne du lave et script der beregner hvor mange bytes der hver mappe på C: og laver en sorteret liste.
Du kan også øve dig med at lave et script der sletter filer der er mere end x dage gamle.
Eller lave et backup/restore script.
Eller et lille spil.
Men det ville måske være en ide at lave et nyt spørgsmål, det kunne tænkes at der var nye der ville med og det tager mit modem over et minut at loade denne side.
Jeg har fået det til at køre. Nu har det sidste batch-script kørt i et par timer og får lov til at køre færdig. Batch-scriptet finder alle ens filer, men ellers gør det ikke noget? Skal den ikke slette filen, hvis der findes en i forvejen?
Jeg har tilføjet del %1 i bunden af scriptet, men synes ikke at scriptet sletter, hvis der findes to af samme fil. Har jeg gjort noget forkert?
@echo off for %%A in (*) do call :First "%%A" %%~zA goto :eof
:First for %%A in (*) do call :compare "%%A" %1 %%~zA %2 goto:eof
:compare if [%1]==[%2] goto :eof if NOT [%3]==[%4] goto :eof fc /B %1 %2 |findstr "no differences encountered" >nul if errorlevel 1 goto :eof echo %1 and %2 is the same file del %1
07/09-2003 13:52:00 skrev jeg: Du skal erstatte "no differences encountered" i scriptet med "Ingen forskelle fundet". Når du tester er det altid en god ide at teste på nogle kendte filer (nogle få). Du kan fjerne @echo off i toppen, så vil den skrive kommandoerne inden den udfører dem. I dette tilfælde kan du også prøve at fjerne >nul i linien med fc, og/eller lave en extra linie med: fc /B %1 %2 inden den der nu, så kan du se outputtet fra fc.
Du mener sådan? Den sletter i hvert fald nu, når der er to ens filer.
for %%A in (*) do call :First "%%A" %%~zA goto :eof
:First for %%A in (*) do call :compare "%%A" %1 %%~zA %2 goto:eof
:compare if [%1]==[%2] goto :eof if NOT [%3]==[%4] goto :eof fc /B %1 %2 |findstr "Ingen forskelle fundet" fc /B %1 %2 if errorlevel 1 goto :eof echo %1 and %2 is the same file del %1
Det tager god nok mange timer. Kan man ikke få scriptet til at køre hurtigere, ved først finde alle de filer som har samme størrelse og derefter sammenligne de filer, som har samme størrelse om de er ens (og slette dem som er ens)?
Der er flere måder man kan gøre det hurtigere, men scriptet bliver let meget kompliceret. Man kunne lave en fil med alle filer og deres størrelse vha: for %%I in (*) do echo %%~zI %%I >>list.txt Derefter kunne man sortere filerne i list.txt filen efter størrelse vha kommandoen sort. Så kunne læse text-filen og sammenligne de filer der har samme størrelse.
Det er også muligt at man kan lave scriptet hurtigere ved at udføre de to første if i funktionen :compare inden man kalder funktionen, derved ville man undgå en række funktionskald. For løkken vil så komme til at se ca. sådan ud (utestet): for %%A in (*) do if not [%%A]==[%1] do if not [%%~zA]==[%2] call :compare "%%A" %1
Så kunne man fjerne de to første linier i :compare funktionen
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.