我是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%
视为空。不知道为什么。
答案 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
,以便在需要时使其不区分大小写。