Avatar billede sunlock Nybegynder
13. december 2006 - 11:25 Der er 12 kommentarer og
2 løsninger

bat-fil: fjern del af string

Jeg har en tekstfil som er fyldt med referencer til andre filer. F.eks.:
c:\tmp\fil1.txt
c:\tmp\ny_tmp\fil2.txt
c:\tmp\ny_tmp\fil3.txt
c:\tmp\ny_tmp2\fil4.txt
c:\tmp\ny_tmp2\extra\fil5.txt
...og så frem deles.

Jeg skal gerne have fat i alt efter c:\tmp\, dvs
fil1.txt
ny_tmp\fil2.txt
ny_tmp\fil3.txt
ny_tmp2\fil4.txt
ny_tmp2\extra\fil5.txt

Hvordan får jeg gjort det? Jeg har lavet følgende:
-----
set SrcFile=
for /F "tokens=*" %%I in (minfil.txt) do call :SetSrcFile "%%I"
@rem Gør intet
goto :eof

:SetSrcFile
set SrcFile=%SrcFile%%~1

@rem HER STÅR JEG MED REF. TIL FILEN, HVORDAN FJERER JEG STARTET AF DENNE STRING?

set SrcFile=

goto :eof
-----

Synes jeg har prøvet lidt af hvert, men må indrømme at bat-filer ikke er min stærke side :-)
Avatar billede ejvindh Ekspert
13. december 2006 - 11:34 #1
Den følgende flytter det ønskede indhold over i minfil2.txt:

for /F "tokens=2* delims=\" %%i in (minfil.txt) do @echo %%j >>minfil2.txt
Avatar billede ejvindh Ekspert
13. december 2006 - 11:35 #2
Efter "do" kan du selvfølgelig vælge at gøre andre ting med indholdet ;-)
Avatar billede sunlock Nybegynder
13. december 2006 - 12:17 #3
Super. Men jeg er lige løbet ind i et andet problem så.

Jeg skal nemlig have kopieret de filer fra et sted til et andet - f.eks. fra c:\tmp til c:\tmp2. Derfor skal jeg have oprettet disse biblioteker først, men da det ikke er alle filer har denne opgave et twist. Det er lidt svært at forklare...

Det jeg prøver er noget ala (men det virker ikke):
for /F "tokens=* delims=vores-source" %%i in (vores_source_dirs.txt) do @md tmp2\%%j

Fejlen er:
A subdirectory or file tmp\%j already exists.

Kan du hjælpe her?
Avatar billede ejvindh Ekspert
13. december 2006 - 12:54 #4
cd c:\
for /F "tokens=2* delims=\" %%i in (c:\prov.txt) do (
if not exist c:\tmp2%%~pj md c:\tmp2%%~pj
)
Avatar billede ejvindh Ekspert
13. december 2006 - 12:59 #5
Eller bedre:

cd c:\
for /F "tokens=2* delims=\" %%i in (vores_source_dirs.txt) do (
if not exist tmp2%%~pj md tmp2%%~pj
)


-- Du kan udskifte "c"'et i første linie efter dit behov (men det er vigtigt at det er roden på det aktuelle drev. Ellers skal du også til at justere tokens-værdien i 2. linie).
Avatar billede sunlock Nybegynder
13. december 2006 - 13:30 #6
Jeg kan godt se ideen, men det virker ikke. Jeg kan forstå at delims er det man skal søge efter og tokens fortæller hvor mange gange man skal finde det, men burde dette ikke virke:
for /F "tokens=* delims=vores-source" %%i in (vores_source_dirs.txt) do (
if not exist tmp%%~pj md tmp%%~pj   
)

hvor jeg skal finde vores-source...
Det kan f.eks. ligge i c:\...\vores-source (altså det er en del af min string).

Jeg får bare lavet folderen som hedder tmp%~pj...
Avatar billede ejvindh Ekspert
13. december 2006 - 14:06 #7
Du har misforstået sætningen. Delims er ikke hvad du søger efter, men adskiller-tegnet. Tokens er hvilket nummer af elementer i linien, der skal behandles.

Du skal derfor ikke lave om på denne del af linie 2.
Avatar billede sunlock Nybegynder
13. december 2006 - 15:41 #8
Det undre ikke nogen :-)

Er det muligt at adskille ved et helt ord frem for et tegn? Eller skal det være et tegn?
Avatar billede ejvindh Ekspert
13. december 2006 - 19:00 #9
Jeg har ikke checket op på det, men så vidt jeg ved, kan man kun bruge tegn som skilletegn.
Avatar billede bertelbrander Novice
13. december 2006 - 20:33 #10
Man kan kun adskille med ét tegn.
Men du kan splitte af to gange med to for loops eller du kan bruge kommandoen set til at fjerne den del man ikke skal bruge, f.eks:
set SS=vores_source_dirs.txt
set SS=%SS:vores_source_=%
Herefter vil SS være dirs.txt

Jeg er ikke sikker på hvad det præcist er du skal bruge.
Avatar billede sunlock Nybegynder
14. december 2006 - 08:43 #11
Problemet er at jeg skal søge efter navnet vores-source, som er en del af de strenge som ligger i vores_source_dirs.txt (altså filen).

Det jeg laver garantere nemlig ikke at følgende er gældende:
c:\tmp\fil1.txt
c:\tmp\ny_tmp\fil2.txt
c:\tmp\ny_tmp\fil3.txt
c:\tmp\ny_tmp2\fil4.txt
c:\tmp\ny_tmp2\extra\fil5.txt

...men blot at noget i denne stil:
x:\...\fil1.txt
x:\...\ny_tmp\fil2.txt
x:\...\ny_tmp\fil3.txt
x:\...\ny_tmp2\fil4.txt
x:\...\ny_tmp2\extra\fil5.txt
, hvor x er et drev og ...\ symbolisere at det kan være pladseret et vilkårligt sted på drev x

Det skal bruges til et maven script, og jeg kan derfor ikke være sikker på at det altid ligger på c:\tmp
Avatar billede ejvindh Ekspert
14. december 2006 - 09:44 #12
Hvis du skal søge efter en bestemt streng, vil det oplagte være at bruge find eller findstr:
http://www.computerhope.com/findhlp.htm
http://www.computerhope.com/findstr.htm

Angående drev-navnet, så kan det nemt løses:

cd %systemdrive%\
for /F "tokens=1,3* delims=\" %%i in (vores_source_dirs.txt) do (
if not exist %%i\tmp2%%~pk md %%i\tmp2%%~pk
@echo %%i\tmp2%%~pk >>vores_source_dirs2.txt
)
(4 linie er blot til at vise transformationen i en ny tekst-fil. Så kan du se, om den giver det, du ønsker)

Hvad jeg ikke er helt sikker på er "..."-sagen. Hvis der kan være en vilkårlig "dybde" indbefattet i de 3 prikker, så har jeg svært ved at se en løsning indenfor batch-programmering (mere oplagt vil et vbscript så være).
Avatar billede sunlock Nybegynder
14. december 2006 - 09:49 #13
Jeg siger i hvert fald tak for din tid... Prøver mig lidt frem. Har lidt smidt lidt flere points :-)
Avatar billede ejvindh Ekspert
14. december 2006 - 10:18 #14
Du er velkommen, og tak for point :-)
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
Kurser inden for grundlæggende programmering

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