windows - få et filnavn, der har * .nupkg udvidelse fra den givne mappe til en variabel i en batchfil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er en rookie i Windows-batch programmering. Følgende er min kode


@echo off
setlocal
set sourcedir=C:ProjectsLibraries
set pdbdir=C:ProjectsAppinDebug
et461
set dlldir=C:Users
adiraju.nugetpackages

@echo Cleaning up the solution. Please wait...

FOR /d \%\%F IN (\%sourcedir\%*) DO (del /q /s \%\%Findebug 1>nul)

@echo Cleaning up completed. Rebuild Started.

FOR /f \%\%F IN ('dir /ad /b \%sourcedir\%*') DO (

    if not "\%\%F"==".vs" (
        cd \%sourcedir\%\%\%F
        dotnet pack
        xcopy \%sourcedir\%\%\%Findebug
et461\%\%F.pdb \%pdbdir\% /Y
        del /q \%sourcedir\%\%\%Findebug*.symbols.nupkg 1>nul
        FOR /F "tokens=*" \%\%I IN ('dir /b /a-d \%sourcedir\%\%\%Findebug') DO (
        set \_ver=\%\%I)
        xcopy \%sourcedir\%\%\%Findebug
et461\%\%F.dll \%dlldir\%\%\%F\%\_ver\%lib
et461 /Y
    )
)


I sidste sætning får jeg \%\_var\% som tom. Ikke sikker på hvorfor.

Bedste reference


    FOR /F "tokens=*" \%\%I IN ('dir /b /a-d \%sourcedir\%\%\%Findebug') DO (
    set \_ver=\%\%I)


vil indstille \_ver (ikke \_var) til det sidste filnavn, der findes i mappen. Forsigtig: Standardordren for et NTFS-volumen er NAME-ordre. Ordren i FAT-volumener er ikke defineret


    xcopy \%sourcedir\%\%\%Findebug
et461\%\%F.dll \%dlldir\%\%\%F\%\_ver\%lib
et461 /Y


Du ser ud til at bruge værdien af ​​\_ver angivet i den foregående logiske erklæring. Læs venligst om Forsinket ekspansion . Værdien af ​​enhver \%var\% i en blok erstattes af værdien af ​​variablen, når blokken først parses, ikke med variabelens runde-værdi.


For at bruge variantens run-time-værdi skal du påberåbe delayedexpansion og derefter bruge !var! i stedet for \%var\% ELLER du kan påberåbe kommandoerne i en separat underrutine ELLER du kan bruge et dynamisk flag:


    del /q \%sourcedir\%\%\%Findebug*.symbols.nupkg 1>nul
    set "flag=Y"
    FOR /F "tokens=*" \%\%I IN ('dir /b /a-d /O-N \%sourcedir\%\%\%Findebug') DO if defined flag (
     set "flag="
     xcopy \%sourcedir\%\%\%Findebug
et461\%\%F.dll \%dlldir\%\%\%F\%\%Ilib
et461 /Y
    )


Bemærk her: flag er indstillet til en værdi (enhver værdi, så længe den er indstillet), så kaldes FOR \%\%I med listen dir i omvendt navn rækkefølge (/O-N), så det ønskede element vises først (/OD vil give omvendt rækkefølge, hvis det er mere passende). Når det første element returneres af FOR \%\%I bliver flag ryddet, og xcopy påberåbes ved hjælp af versionen i \%\%I. Siden flag ryddes, vil if defined forhindre xcopy på yderligere mappeposter. (if defined virker på variabelens run-time-værdi)


Bemærk også, at du kan ændre en if med /i -knappen for at gøre det tilfældigt ufølsomt, hvis det er nødvendigt.