Batch file 批量获取%%A的最后一个字符

Batch file 批量获取%%A的最后一个字符,batch-file,Batch File,我想在批处理文件中创建一个变量,该变量包含共享文件夹中“最新”文件夹的路径。 该共享文件夹上的每个文件夹末尾都有一个版本号,即:“product_1.0.0.1” 我的方法是迭代父文件夹并检查子目录的最后一个字符,其中数字是最高的 set latest=\\Share\prod\1.0\tools\prod_1.0.0.0 for /d %%A in ("\\Share\prod\1.0\tools") do if %%A:~1 gtr %latest:~1% (set late

我想在批处理文件中创建一个变量,该变量包含共享文件夹中“最新”文件夹的路径。
该共享文件夹上的每个文件夹末尾都有一个版本号,即:“product_1.0.0.1”

我的方法是迭代父文件夹并检查子目录的最后一个字符,其中数字是最高的

set latest=\\Share\prod\1.0\tools\prod_1.0.0.0
for /d %%A in ("\\Share\prod\1.0\tools") do 
  if %%A:~1 gtr %latest:~1% 
    (set latest=%%A)
这不起作用,因为它似乎没有得到最后一个字符
%%A

写这个问题时,我脑海中出现的另一个问题是如何处理大于9的数字?

据我所知,
:~1
获取最后一个字符,因此更好的方法可能是在最后一个点后面获取所有内容。我该怎么做?

您可以使用
dir/ad/oe/b“\\Share\prod\1.0\tools”
。选项
/ad
表示“仅列出目录(文件夹)”,选项
/oe
表示“按扩展顺序”,而
/b
表示“裸输出”(仅列出名称)。扩展是最后一个点之后的所有内容。然后,您可以将其放入循环中,并为每个结果设置
latest
,变量将得到最后一个结果。或者使用选项
/o-e
(“按扩展顺序反向排列”),然后在第一次迭代后中断循环:

set latest=
for /f "delims=" %%a in ('dir /ad /o-e /b "\\Share\prod\1.0\tools"') do (
    set latest=%%a
    goto exit1
)
:exit1

上面的问题是当数字超过9时该怎么办。您可以通过将它们命名为product_1.0.0.001、product_1.0.0.002等来解决这个问题。

您需要启用延迟扩展。有关详细信息,请参见cmd控制台中的
setlocal/?
help set
。您需要
设置“var=%%~A”
然后
如果!变量:~-1!全球技术法规%最新:~-1%
%%~A
与其说是变量,不如说是迭代器,不能直接用于替换字符串提取或替换。但是,将%variable%设置为
%%~a
的值非常简单。此外,如果要比较Major.Minor.Build.Revision版本数据,则在PowerShell中转换为
System.version
对象会更容易。您可以进行数字比较,而无需拆分或使用子字符串。@rojo此bat不是构建的一部分。这是一种更简单的方法,可以从build drop文件夹中获取一些二进制文件和所需数据给使用它的人员,这样他们就不需要搜索最新的文件夹并“猜测”需要哪些文件。但是感谢对
%%A
的澄清,我认为它更像是一个典型的for each循环。