我是windows批处理编程的新手。以下是我的代码
@echo off
setlocal
set sourcedir=C:ProjectsLibraries
set pdbdir=C:ProjectsAppbinDebugnet461
set dlldir=C:Usersradiraju.nugetpackages
@echo Cleaning up the solution. Please wait...
FOR /d %%F IN (%sourcedir%*) DO (del /q /s %%Fbindebug 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%%%Fbindebugnet461%%F.pdb %pdbdir% /Y
del /q %sourcedir%%%Fbindebug*.symbols.nupkg 1>nul
FOR /F "tokens=*" %%I IN ('dir /b /a-d %sourcedir%%%Fbindebug') DO (
set _ver=%%I)
xcopy %sourcedir%%%Fbindebugnet461%%F.dll %dlldir%%%F%_ver%libnet461 /Y
)
)
在最后一个语句中,我得到%_var%
为空。不知道为什么。
FOR /F "tokens=*" %%I IN ('dir /b /a-d %sourcedir%%%Fbindebug') DO (
set _ver=%%I)
将把_ver
(而不是_var
)设置为在目录中找到的最后一个文件名注意:NTFS卷的默认顺序是NAME顺序。FAT卷中的订单未定义
xcopy %sourcedir%%%Fbindebugnet461%%F.dll %dlldir%%%F%_ver%libnet461 /Y
您似乎希望使用上一个逻辑语句中设置的_ver
的值。请阅读延迟扩展。第一次解析块时,块中任何%var%
的值都将替换为该变量的值,而不是该变量的运行时值。
要使用变量的运行时值,需要调用delayedexpansion
AND,然后使用!var!
代替%var%
,或者可以在单独的子例程中调用命令,或者可以使用动态标志:
del /q %sourcedir%%%Fbindebug*.symbols.nupkg 1>nul
set "flag=Y"
FOR /F "tokens=*" %%I IN ('dir /b /a-d /O-N %sourcedir%%%Fbindebug') DO if defined flag (
set "flag="
xcopy %sourcedir%%%Fbindebugnet461%%F.dll %dlldir%%%F%%Ilibnet461 /Y
)
注意:flag
被设置为某个值(任何值,只要它被设置),然后FOR %%I
被调用,dir
列表按相反的名称顺序(/O-N)
,这样所需的元素就会首先出现(如果更合适的话,/O-D会产生相反的日期顺序)。当FOR %%I
返回第一个元素时,则清除flag
,并使用版本调用xcopy
在CCD_ 16中。由于flag
被清除,那么if defined
将阻止xcopy
进入更多的目录条目。(if defined
对变量的运行时间值进行运算)
还请注意,如果需要,您可以使用/i
开关修改if
,使其不区分大小写。