Avatar billede majsmarken Nybegynder
20. april 2005 - 13:29 Der er 25 kommentarer og
1 løsning

DOS *.cmd script: Check for 0 i filstørrelse

Dødelig *.BAT / *.CMD script...

I en dum *.CMD fil skal jeg bla. checke for om en (tekst)fil's størrelse er >0 . Altså større end nul.

Der er vist et eller andet standard  ERRORLEVEL  trix jeg ka' bruge men ka' nu ikke finde/huske fidusen...

Det ka' nogle af jeg vel lige hælde ud at ærmet ???

Evt. et link til andre standard ERRORLEVEL trix - via XP's cmd box
Avatar billede majsmarken Nybegynder
20. april 2005 - 17:20 #1
???

Skulle dette måske have været i en anden kat. ?
Avatar billede bertelbrander Novice
20. april 2005 - 18:19 #2
Følgende lister alle filer der har størrelsen 0:

for %%I in (*) do @if %%~zI EQU 0 echo %%I
Avatar billede majsmarken Nybegynder
20. april 2005 - 18:25 #3
Jeg skal checke om en specific fil (kun) er 0 (NUL) i størrelsen og derudaf gøre et eller andet; eks. GOTO DOIT
Avatar billede bertelbrander Novice
20. april 2005 - 18:28 #4
for %%I in (minfil.ext) do @if %%~zI EQU 0 goto doit
Avatar billede majsmarken Nybegynder
21. april 2005 - 10:15 #5
Hmmm... det ser noget specielt ud...
Ser ud til at virke...

I sidste ende brugte jeg DOS'sens COMP for at sammenligne to filer's indhold i kombination med  errorlevel  variablen...
Avatar billede majsmarken Nybegynder
21. april 2005 - 10:23 #6
<bertelbrander>: Nu da du lader til at have "styr" på dette:

Dødelig *.BAT / *.CMD script...

Copy NYESTE fil (evt. af typen [.etellerandet]) fra mappe X til mappe Y. Notér filnavnet i en variabel til brug i den videre behandling...
Avatar billede bertelbrander Novice
21. april 2005 - 19:34 #7
@echo off
set First=

for /F "tokens=*" %%I in ('dir /B /A-D /O-D') do call :Process "%%I"
echo Den nyeste fil er %First%
goto :eof

:Process
if NOT [%First%]==[] goto :eof
set First=%1

First bliver sat til at være navnet på den nyeste fil, du kan så kopiere med:
copy %First% g:\pop

Hvis du vil finde den nyeste med en bestemt extension skal du ændre dir delen i for linien.
Avatar billede majsmarken Nybegynder
21. april 2005 - 20:04 #8
Generelt - hvor ka' jeg bedst finde tips&trix til den 'slags' ?
Avatar billede majsmarken Nybegynder
21. april 2005 - 20:06 #9
Variable %CheckDir% er den mappe hvor der skal checkes
Variable %FTPDir% er den mappe hvor der skal copy til
Vil dette så virke ? :



@echo off
set First=

for /F "tokens=*" %%I in ('dir %CheckDir% /B /A-D /O-D') do call :Process "%%I"
echo Den nyeste fil er %First%
goto :eof

:Process
if NOT [%First%]==[] goto :eof
set First=%1

First bliver sat til at være navnet på den nyeste fil, du kan så kopiere med:
copy %CheckDir%\%First% %FTPDir%\%First%
Avatar billede bertelbrander Novice
21. april 2005 - 20:12 #10
Det ser ud til at virke.

Det er meget svært at finde noget godt info om batch-scripts, man kan læse om kommandoerne her:
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds.mspx
Avatar billede majsmarken Nybegynder
24. april 2005 - 22:02 #11
<bertelbrander>: Under alle omstændigheder - læg et [svar] (har fordoblet point!)

Principet er indbygge i et større script med en del if/else goto osv. Programmet står og ruller selv i baggrunden med pt. 10 sek. intervald.

MEN - efter X tid:

****** B A T C H - R E K U R S I O N E R N E  overstiger  STAKGRÆNSERNE ******
Antal rekursioner=598, Forbrug af stakken=90 procent
******    B A T C H B E H A N D L I N G E N  E R  A F B R U D T      ******

Og det er stort set kun "din" ovenstående del der rulles i ved det meste af tiden...
Jeg ka' godt forestille mig at det er noget med hop/goto ud at if/else statments som ikke er heeeeeelt lovlige. Jeg ka' dog ikke finde det...
Er der er tommelfingerregel i den retning ?

(Eller ska' jeg oprette et nyt spm. i den retning ?)
Avatar billede majsmarken Nybegynder
24. april 2005 - 22:05 #12
Jeg ka' godt 'se' at

do call :Process "%%I"

kalder subrutinen

:Process
if NOT [%First%]==[] goto :eof
set First=%1

men hvordan finder den "tilbage" igen (det som jeg kender som ENDSUB) ?
Avatar billede majsmarken Nybegynder
24. april 2005 - 22:15 #13
Bare jeg ruller denne alene:

@echo off
set CheckDir=E:\Temp\Upload\Test
:LOOP
set First=

for /F "tokens=*" %%I in ('dir %CheckDir% /B /A-D /O-D') do call :Process %%I
goto eof

:Process
if NOT [%First%]==[] goto :eof
set First=%1
echo Den nyeste fil er %First%

:eof
goto LOOP

så dør den med
****** B A T C H - R E K U R S I O N E R N E  overstiger  STAKGRÆNSERNE ******
Antal rekursioner=598, Forbrug af stakken=90 procent
******    B A T C H B E H A N D L I N G E N  E R  A F B R U D T      ******

Hvad kan (=skal) ændres ???
Avatar billede bertelbrander Novice
24. april 2005 - 22:37 #14
Når man kalder en "subroutine" med call :process afsluttes subroutinen med en goto :eof eller når batfilen når til enden. Tænk på subroutinen som en anden bat-fil, der tilfælidigvis befinder sig i samme fil, parametrene bliver overført på samme måde. Så endsub svarrer til goto :eof

:eof er normalt en implicit label i bunden af filen.

Følgende burde virke:

@echo off
set CheckDir=d:\temp

:LOOP
set First=
for /F "tokens=*" %%I in ('dir %CheckDir% /B /A-D /O-D') do call :Process %%I
echo Den nyeste fil er %First%
goto loop

:Process
if NOT [%First%]==[] goto :eof
set First=%1
Avatar billede majsmarken Nybegynder
25. april 2005 - 15:42 #15
Ovenstående indført - OK
(Der går dog lidt kage i det hvis mappen er tom...)
Avatar billede bertelbrander Novice
25. april 2005 - 19:41 #16
Du kan lave en test efter for linien:
if [%First%]==[] goto loop

Den tester om first er tom, det vil den være hvis mappen er tom, i så fald går den tilbage til loop.
Avatar billede majsmarken Nybegynder
25. april 2005 - 19:47 #17
Den havde jeg luret af...
Avatar billede majsmarken Nybegynder
25. april 2005 - 20:04 #18
Alle goe' gange 3:

Jeg ska' have extractet information om dagens dato og lagt ind i hver sin variabel:
* År2 (2 cifre)
* År2 (4 cifre)
* Måned (2 cifre)
* Måned (stavet DK eller US)
* Dag (2 cifre)
* Dag (stavet DK eller US)

Jeg fandt denne i anden forbindelse: http://www.chebucto.ns.ca/~ak621/DOS/BatBasic.html
men er lige lidt for BASIC...
Eller så bliver der henvist til 3. parts programstump.

Der skal nok være et trix mht %date% ?
Hvad ka' du ryste ud af ærmet ?

Det er nok en loop 'ting' men mht måned/dag stavet så - hmmm... Det giver jo et tal... men ved at rulle igennem et array (?) med måned/dag stavet bør det kunne la' sig gøre.
Jeg har gjort det trix i de gamle (!) COMAL80 dage - tihi...
Avatar billede majsmarken Nybegynder
25. april 2005 - 20:05 #19
(Opdateret POINT)
Avatar billede bertelbrander Novice
25. april 2005 - 20:16 #20
Man kunne starte her:
@echo off
for /F "tokens=1-3 delims=-" %%A in ("%date%") do set Year4=%%C& set Mon=%%B& set Day=%%A
set Year2=%Year4:~-2%

if %Mon:~0,1%==0 (
  set MM=%Mon:~-1%
) else (
  set MM=%Mon%
)
for /F "tokens=%MM%" %%I in ("Jan Feb Marts April Maj Juni Juli August Oktober November December") do set MonthName=%%I
echo %MonthName%

Der kan godt være forskelle mellem en dansk og en engelsk!

"Dag (stavet DK eller US)", er det f.ex. mandag? Det er ret svært at lave.
Avatar billede majsmarken Nybegynder
25. april 2005 - 20:23 #21
Det var hurtigt svar...

Det med ugedagene's navn bør da kunne gøres på samme måde som måned princippet ?

Prøver/leger lige...
Avatar billede bertelbrander Novice
25. april 2005 - 20:30 #22
%Date% giver måned, så det er let at slå navnet på måneden op.
%Date% giver ikke ugedag, det er ret besværligt at beregne denne.
...går lige i tænkebox.
Avatar billede bertelbrander Novice
25. april 2005 - 20:48 #23
Du kan downloade og udpakke denne:
http://home20.inet.tele.dk/midgaard/datestr.zip
Så kan du køre:
datestr %A
Så vil den skrive: Monday
Kommandoen:
for /F %I in ('datestr %A') do set Ugedag=%I
Vil sætte %ugedag%
Husk at bruge %% hvis det er i en bat-fil.

Du kan se alle format parametrene her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_strftime.2c_.wcsftime.asp
Avatar billede majsmarken Nybegynder
29. april 2005 - 23:35 #24
<bertelbrander>: Under alle omstændigheder - læg et [svar] (har fordoblet point!)
Avatar billede bertelbrander Novice
29. april 2005 - 23:46 #25
Jeg samler stadig ikke på point.
Avatar billede majsmarken Nybegynder
30. april 2005 - 08:15 #26
(selv)ping...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester