windows -\% a og \%\% a pludselig virker ikke i Win 10 cmd og batchfilen?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøgte at batch konvertere en mappe til .flac til .mp3 ved hjælp af FFMPEG, men da jeg kørte min batchfil fik jeg fejlen '\% F uventet på dette tidspunkt', selvom jeg brugte '\%\% F' i batchet fil. For at teste hvad der virkelig var problemet, fortsatte jeg med at skrive variationer af\% F til cmd direkte, men kunne heller ikke få det til at fungere. Har der ændret noget i Windows 10 om brugen af ​​variable navne i for loop?


cmd kommandoer forsøgte jeg:


C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%F" in     (*.flac) echo \%F
"\%F" was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for \%F in     (*.flac) echo \%F
echo was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%\%F" in     (*.flac) echo \%\%F
"\%\%F" was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%f" in     (*.flac) echo \%f
"\%f" was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%g" in     (*.flac) echo \%g
"\%g" was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%g" in     ("*.*") echo \%g
"\%g" was unexpected at this time.

C:UsersytMusicJoe Hisaishi (Classical Guitar) - Copy>for "\%g" in     ("*.*") do echo \%g
"\%g" was unexpected at this time.


original batch-fil til FFMPEG


cd "UsersytMusicJoe Hisaishi (Classical Guitar) - Copy"
echo in directory "\%cd\%"
pause
for "\%\%F" in ("*.flac") do (
echo converting "\%\%F"
"C:UsersytDownloadsOtherAppsFFMPEGinffmpeg.exe" -i "\%\%F"     -codec:a libmp3lame -qscale:a 2 "\%\%~nF.mp3"
echo del "\%\%F"
)
cd "\%~dp0"

Bedste reference


Brug følgende batchkode:


pushd "\%USERPROFILE\%MusicJoe Hisaishi (Classical Guitar) - Copy"
echo In directory "\%cd\%"
pause
for \%\%F in ("*.flac") do (
    echo Converting "\%\%F" ...
    "\%USERPROFILE\%DownloadsOtherAppsFFMPEGinffmpeg.exe" -i "\%\%F" -codec:a libmp3lame -qscale:a 2 "\%\%~nF.mp3"
    echo del "\%\%F"
)
popd


Den største fejl er definitionen af ​​loop-variablen F i dobbelt citater ved at bruge "\%\%F", som ikke er korrekt. Slukkevariablen skal altid defineres uden at omslutte den i dobbelt citater. Ved at referere til værdien af ​​loop-variablen i kommando- eller kommandoklokken udført på hver fundet fil, bør de dobbelte citater anvendes i tilfælde af plads eller &()[]{}^=;!'+,`~ i filnavn.


Det er bedre at bruge værdien af ​​miljøvariabel USERPROFILE i stedet for at kodere mappestierne med dit brugernavn. Se Wikipedia-artikel om Windows Miljøvariabler. [32]


Brugen af ​​kommandoerne pushd og popd er bedre at skifte nuværende katalog og senere genoprette det end at bruge kommando cd to gange.


Sletningen af ​​den konverterede * .flac-fil udføres ikke af batchfilen ovenfor på grund af kommandoen echo før til test.


Men det ville være muligt at skrive denne batchkode uden at skifte det aktuelle bibliotek overhovedet.


for \%\%F in ("\%USERPROFILE\%MusicJoe Hisaishi (Classical Guitar) - Copy*.flac") do (
    echo Converting "\%\%F" ...
    "\%USERPROFILE\%DownloadsOtherAppsFFMPEGinffmpeg.exe" -i "\%\%F" -codec:a libmp3lame -qscale:a 2 "\%\%~dpnF.mp3"
    if not errorlevel 1 del "\%\%F"
)


Denne batchkode sletter nu * .flac-filen efter en vellykket konvertering af filen til MP3-format.


Bemærk: Jeg har ikke installeret ffmpeg.exe og ved derfor ikke rigtigt, om det går ud med 0 på succes og med en værdi større 0 på en fejl.


For at forstå de anvendte kommandoer og hvordan de virker, skal du åbne et kommandopromptvindue, udføre de følgende kommandoer, og læs helt alle hjælpesider, der vises for hver kommando, meget omhyggeligt.



  • del /?

  • echo /?

  • for /?

  • if /?

  • popd /?

  • pushd /?



Og læs også Microsofts supportartikel Testing for et bestemt fejlniveau i batchfiler. [33]

Andre referencer 1


Don t bruge


FOR "\%F" ...


på kommandolinjen men


FOR \%F ...


I et script skal du bruge \%\% i stedet for \%:


FOR \%\%F ...


men ikke


FOR "\%\%F" ..


Samme princip for "\%G" ("\%\%G"), brug \%G (\%\%G) i stedet