Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[batch] problemen met setten van een variabele

Pagina: 1
Acties:
  • 117 views sinds 30-01-2008
  • Reageer

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik heb een batch file aangemaakt (en getest onder winXp) die o.a. een directory met files moet uitlezen. Het probleem waar ik op stuit is dat als ik een variabele zet met SET var=waarde, hij die waarde hardnekkig vast blijft houden:

Dit bijvoorbeeld
Batchfile:
1
2
3
4
for %%i in (*.xml) do (
    set file=%%i
    echo %file%
)


Als ik dit in een directorie met de files (test1.xml en test2.xml) uitvoer, dan is de output:
file2.xml
file2.xml

(Als ik rechtstreeks %%i echo, dan laat hij het wel goed zien)

Hoe kan ik voorkomen dat dit gebeurt? Ik heb al flink lopen zoeken, bijvoorbeeld naar hoe te unsetten, maar kon niets vinden.

Ik wil het namelijk hier voor gebruiken:

Batchfile:
1
2
file=%%i
set dir=images_%file:~0,-4%


het lukt me niet om dat zonder tussenkomst van een variabele op te lossen.

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Het schijnt te kunnen met :

code:
1
set file=


Echter, dit werkt voor geen meter. Hij zeurt er nu over dat de environment variable niet gezet is als ik

code:
1
2
set file=
set file=%%i


en verderop %file% wil gebruiken
Ook als ik het helemaal aan het einde van het loopje zet (wat hetzelfde effect zou moeten hebben), dan krijg ik diezelfde melding.

Het lijkt wel of er een enorme vertaging in zit.

Iemand een betere oplossing?

[ Voor 74% gewijzigd door marty op 17-09-2007 15:52 ]


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
oplossing reeds gevonden:

zet bovenaan: SETLOCAL ENABLEDELAYEDEXPANSION

de volgende code zal vervolgens werken zoals gewenst:

code:
1
2
3
4
for %%i in (*.xml) do (
    set file=%%i
    echo !file!
)


Door de variabele tussen uitroeptekens te zetten (ipv %) zullen ze tijdens runtime gezet worden

  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Aah, weer wat geleerd.
Ik heb die setlocal nooit gebruikt, ik deed dit soort dingen altijd via een omweg
code:
1
2
3
4
5
6
7
@echo off
for %%i in (*.xml) do set file=%%i& call :echofile
goto :eof

:echofile
echo %file%
goto :eof

Maar zoals jij het nu hebt, is veel duidelijker en nog korter ook

500 "The server made a boo boo"


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Setlocal is sowieso wel handig omdat je daarmee niet je environment 'vervuilt' met allerlei meuk uit batch bestandjes.

Ik kende het eigenlijk niet in deze context en ook de uitroeptekentjes kende ik niet.
* Annie ook wat geleerd :)

C:\> CMD /? 

[...]

/V:ON   Schakelt vertraagde uitbreiding van omgevingsvariabele in met ! als
        scheidingsteken. Bijvoorbeeld: /V:ON staat !var! toe de variabele
        var uit te breiding tijdens uitvoering. De syntaxis var breidt
        variabelen uit tijdens de invoer, wat heel anders is binnen een
        FOR-lus.

[...]

Vertraagde extensie van omgevingsvariabele is NIET standaard
ingeschakeld. U kunt deze extensie in- of uitschakelen voor een
specifieke aanroep van CMD.EXE met de schakeloptie /V:ON of /V:OFF.
U kunt voltooiing van alle aanroepen van CMD.EXE in- of uitschakelen op
een computer en/of gebruikersaanmeldingssessie door het instellen van een
of beide van de volgende REG_DWORD-waarden in het register op 0x1 of 0x0
met behulp van REGEDT32.EXE:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

        en/of

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

De gebruikerspecifieke instelling gaat boven de instelling van de computer.
De opdrachtregelparameters gaan boven de registerinstellingen.

Als vertraagde uitbreiding van omgevingsvariabele is ingeschakeld, kan het
uitroepteken worden gebruikt om de waarde van de omgevingsvariabele te 
vervangen tijdens uitvoering.

Today's subliminal thought is: