Vad gör jag fel med detta batch-script?

Permalänk
Medlem

Vad gör jag fel med detta batch-script?

Måste fråga efter lite snabb hjälp.
Jag gör ett batchscript (Win), som ska läsa av filnamnet på den enda *.wav-fil som finns i en mapp, och spara det filnamnet i variabeln "FileName". Jag tycker koden jag gjort ska funka, men filnamnet verkar inte matas in i FileName, och jag lyckas inte räkna ut varför. Någon med fler hjärnceller än mig?

setlocal
set "MyDir=C:\Users\[username]\Desktop\TEST\SRC"
set "MyWavExt=wav"
pushd %MyDir%
for %%a in (*.%MyWavExt%) do set FileName=%%a
popd
endlocal
echo %FileName%
pause

Permalänk
Medlem

Inte satt parenteserna fel i rad 3 och 4?

Testa
set MyDir="C:\Users\[username]\Desktop\TEST\SRC"
set MyWavExt="wav"

Permalänk
Medlem
Skrivet av cbe:

Inte satt parenteserna fel i rad 3 och 4?

Testa
set MyDir="C:\Users\[username]\Desktop\TEST\SRC"
set MyWavExt="wav"

Harkel. Ser ut som det är en klar förbättring av koden, ja. Men dessvärre fungerar det inte ändå. %FileName% är helt enkelt bara tom.

Permalänk

Om det bara avser ett enda filnamn

@echo off
set MyDir=C:\Users\[username]\Desktop\TEST\SRC
set MyWavExt=wav
pushd %MyDir%
for %%a in (*.%MyWavExt%) do (
set Filename=%%a
)
echo %Filename%
popd
pause

om det avser flera filnamn

@echo off
set MyDir=C:\Users\[username]\Desktop\TEST\SRC
set MyWavExt=wav
pushd %MyDir%
for %%a in (*.%MyWavExt%) do ( echo %%a )
popd
pause

Permalänk
Medlem
Skrivet av PederBejegard:

Om det bara avser ett enda filnamn

1 @echo off
2 set MyDir=C:\Users\[username]\Desktop\TEST\SRC
3 set MyWavExt=wav
4 pushd %MyDir%
5 for %%a in (*.%MyWavExt%) do (
6 set Filename=%%a
7 )
8 echo %Filename%
9 popd
10 pause

Ah, se där. Var det införandet av en parentes på rad 5, eller utelämnandet av "setlocal" som gjorde det?

Permalänk

%variabler% i batch-filer expanderas innan varje statement. Det är inte helt självklart exakt när de expanderas, men grundregeln är att det sker tidigare än man tror, och oftast vill!

Prova det här istället:

setlocal enabledelayedexpansion set MyDir="C:\Users\[username]\Desktop\TEST\SRC" set MyWavExt="wav" pushd %MyDir% for %%a in (*.%MyWavExt%) do ( set fn=%%a set FileName=!fn! ) popd echo %FileName% pause

enabledelayedexpansion fördröjer expandsionen till ett senare skede, där vi vill att den ska utföras. Den inför även !variable!-syntaxen.

Visa signatur

Ockhams rakkniv går utmärkt att tillämpa även på datorproblem: när du hör hovar, tänker du inte "zebra".

Permalänk
Medlem
Skrivet av MvonSchantz:

%variabler% i batch-filer expanderas innan varje statement. Det är inte helt självklart exakt när de expanderas, men grundregeln är att det sker tidigare än man tror, och oftast vill!

Prova det här istället:

setlocal enabledelayedexpansion set MyDir="C:\Users\[username]\Desktop\TEST\SRC" set MyWavExt="wav" pushd %MyDir% for %%a in (*.%MyWavExt%) do ( set fn=%%a set FileName=!fn! ) popd echo %FileName% pause

enabledelayedexpansion fördröjer expandsionen till ett senare skede, där vi vill att den ska utföras. Den inför även !variable!-syntaxen.

Intressant tips. Tack så mycket.

Permalänk
Medlem
Skrivet av PederBejegard:

.. om det avser flera filnamn

@echo off
set MyDir=C:\Users\[username]\Desktop\TEST\SRC
set MyWavExt=wav
pushd %MyDir%
for %%a in (*.%MyWavExt%) do ( echo %%a )
popd
pause

Jag försökte mig på det här med. Men ja, jag måste vara helt blåst eller naiv.
Säg mig, varför funkar det här:
----
set MyDir=C:\Users\[username]\Desktop\TEST\SRC
set MyWavExt=wav
pushd %MyDir%
for %%a in (*.%MyWavExt%) do (
set FileName=%%a
echo %%a
)
----
.. men inte det här nedan (enda skillnaden är fetad)??
----
set MyDir=C:\Users\[username]\Desktop\TEST\SRC
set MyWavExt=wav
pushd %MyDir%
for %%a in (*.%MyWavExt%) do (
set FileName=%%a
echo %FileName%
)
----

Permalänk

Sätt set FileName=%%a innan for loopen

@echo off
set MyDir="C:\Users\[username]\Desktop\TEST\SRC"
set MyWavExt=wav
pushd %MyDir%
set FileName=%%a
for %%a in (*.%MyWavExt%) do (
echo %FileName%
)

Permalänk
Medlem

Varför skriva batchscript när man kan använda ps?

Permalänk
Skrivet av Dooley:

Säg mig, varför funkar det här:...
echo %%a
... men inte det här nedan (enda skillnaden är fetad)??...
set FileName=%%a
echo %FileName%

För att i det undre fallet har du en tilldelning av FileName från a inuti loopen. Men i batch-filer expanderas variabler innan statement utförs. Statementet i det här fallet är for-loopen. I det läget har a tomma värdet.

Jag vet att det är ointuitivt om man har den minsta erfarenhet av andra språk, men tilldelningen av FileName görs alltså, på sätt och vis, innan loopen utförs. Det är överförenklat, men du kan se det så i alla fall.

echo %%a är ingen tilldelning, och utförs alltså inuti loopen. Det är därför din första variant fungerar, men inte din andra.

Visa signatur

Ockhams rakkniv går utmärkt att tillämpa även på datorproblem: när du hör hovar, tänker du inte "zebra".