从给定文件夹获取一个具有* .nupkg扩展名的文件名到批处理文件

时间:2017-01-22 06:36:39

标签: windows batch-file

我是windows批处理编程的新手。以下是我的代码

@echo off
setlocal
set sourcedir=C:\Projects\Libraries
set pdbdir=C:\Projects\App\bin\Debug\net461
set dlldir=C:\Users\radiraju\.nuget\packages

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

FOR /d %%F IN (%sourcedir%\*) DO (del /q /s %%F\bin\debug\ 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%\%%F\bin\debug\net461\%%F.pdb %pdbdir% /Y
        del /q %sourcedir%\%%F\bin\debug\*.symbols.nupkg 1>nul
        FOR /F "tokens=*" %%I IN ('dir /b /a-d %sourcedir%\%%F\bin\debug') DO (
        set _ver=%%I)
        xcopy %sourcedir%\%%F\bin\debug\net461\%%F.dll %dlldir%\%%F\%_ver%\lib\net461 /Y
    )
)

在上一个声明中,我将%_var%视为空。不知道为什么。

1 个答案:

答案 0 :(得分:1)

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

会将_ver(不是_var)设置为目录中找到的最后一个文件名。 警告:NTFS卷的默认顺序是NAME顺序。未定义FAT卷中的订单

    xcopy %sourcedir%\%%F\bin\debug\net461\%%F.dll %dlldir%\%%F\%_ver%\lib\net461 /Y

您似乎想要使用上一个逻辑语句中设置的_ver的值。请阅读延迟扩展。当块首次被解析时,块中任何%var%的值将被该变量的值替换,而不是变量的运行时值。

要使用变量的运行时值,您需要调用delayedexpansion然后使用!var!代替%var%或者您可以在单独的子例程中调用命令或你可以使用动态标志:

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

请注意:flag设置为某个值(任何值,只要它已设置),然后使用反向名称{FOR %%I列表调用dir 1}}以便首先显示所需的元素(如果更合适,则OD将产生反向日期顺序)。当(/O-N)返回第一个元素时,FOR %%I被清除,flag使用xcopy中的版本?进行调用。由于%%I已清除,因此flag将阻止if defined进一步的目录条目。 (xcopy对变量的运行时值进行操作)

另请注意,您可以使用if defined开关修改if,以便在需要时使其不区分大小写。