我们有一个批处理文件,用于根据在特定位置创建的最新文件夹的文件夹名称创建变量。随着该软件的较新版本的发布,版本号(文件夹名称)也将在此目录中创建10.0,10.1,10.2,10.3文件夹。到目前为止,这已经顺利完成,但是在上次更新中,他们决定在同一目录中添加一个名为Install
的文件夹。
是否可以更改以下脚本以忽略Install
文件夹,并选择最新创建的文件夹名称:
SET TABVER="C:\Program Files\Tableau\Tableau Server\"
FOR /F "delims=" %%i IN ('dir %TABVER% /b /ad-h /t:c /od') DO SET VERSION=%%i
SET TABCMD="C:\Program Files\Tableau\Tableau Server\%VERSION%\bin\tabcmd.exe"
答案 0 :(得分:0)
可以使用此批处理代码:
set "TABVER=C:\Program Files\Tableau\Tableau Server\"
for /F "delims=" %%I in ('dir "%TABVER%" /B /AD-H /T:C /O-D 2^>nul') do if /I not "%%I" == "Install" set "VERSION=%%I" & goto FoundVersion
echo Error: There is no version subfolder in probably not already existing folder:
echo/
echo %TABVER%
echo/
pause
goto :EOF
:FoundVersion
set TABCMD="%TABVER%%VERSION%\bin\tabcmd.exe"
rem Other commands using TABCMD
DIR 选项/od
被修改为/O-D
,以命令 DIR 以最新目录首先按相反顺序输出子目录列表最古老的目录。
附加的 IF 命令将当前目录名称不区分大小写与字符串Install
进行比较。仅当目录名称不 Install
时,才会将目录名称分配给环境变量VERSION
,并且退出循环而不处理所有其他目录名称并跳转到标签{{ 1}}。
我添加了一个错误输出,如果FoundVersion
根本不存在,不包含子目录或仅包含C:\Program Files\Tableau\Tableau Server
并停止批处理文件执行,直到用户按任意键然后退出批处理文件处理
另请阅读有关Using Command Redirection Operators的Microsoft文章,了解Install
的说明。重定向运算符2>nul
必须使用 FOR 命令行上的插入符>
进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式^
命令行。
另请参阅How to set environment variables with spaces?通常,最好使用命令行dir
并使用set "variable=value"
引用环境变量,而不是使用"%variable%"
并引用环境变量只是set variable="value"
。查看%variable%
引用为什么没有为文件路径指定带双引号的环境变量。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
%TABVER%
dir /?
for /?
goto /?
if /?
pause /?
rem /?
另请阅读single line with multiple commands using Windows batch file和Where does GOTO :EOF return to?