Windows批处理文件计数令牌数
我有这个批处理文件:Windows批处理文件计数令牌数,windows,batch-file,cmd,Windows,Batch File,Cmd,我有这个批处理文件: @ECHO OFF SETLOCAL EnableDelayedExpansion IF EXIST OPERATORS_FULL.csv DEL OPERATORS_FULL.csv IF EXIST OPERATORS_FULL.tmp DEL OPERATORS_FULL.tmp FOR %%A IN ( OPERATORS_*.csv ) DO ( :: get attribute from filename SET "attr=%%A"
@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF EXIST OPERATORS_FULL.csv DEL OPERATORS_FULL.csv
IF EXIST OPERATORS_FULL.tmp DEL OPERATORS_FULL.tmp
FOR %%A IN ( OPERATORS_*.csv ) DO (
:: get attribute from filename
SET "attr=%%A"
SET "attr=!attr:OPERATORS_=!"
SET "attr=!attr:.csv=!"
:: split string to get date suffix
FOR /F "tokens=1,2 delims=_" %%G IN ( "!attr!" ) DO (
SET attr=%%G
SET date_=%%H
)
:: dump CSVs, skipping each header line, adding the attributes from the filename
FOR /F "skip=1 tokens=*" %%G IN ( %%A ) DO ECHO %%G;!attr!;!date_! >> OPERATORS_FULL.tmp
)
REN OPERATORS_FULL.tmp OPERATORS_FULL.csv
attr值是可变的,它可以包含1,2,3,4,。。。具有“uu”字符。
因此,tokens=1,2
并非每次都是功能性的。
我想要“attr”变量的最后一个标记
有什么建议吗
更新
我试过这个:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF EXIST Operatori_FULL.csv DEL Operatori_FULL.csv
IF EXIST Operatori_FULL.tmp DEL Operatori_FULL.tmp
FOR %%A IN ( Operatori_*.csv ) DO (
:: get attribute from filename
SET "attr=%%A"
SET "attr=!attr:Operatori_=!"
SET "attr=!attr:.csv=!"
set "date_=!attr!"
:loop
if "!date_:_=!" == "!date_!" goto :gotdate
for /f "delims=_ tokens=1,*" %%g in ("!date_!") do echo %%h
pause
goto :loop
:gotdate
:: dump CSVs, skipping each header line, adding the attributes from the filename
FOR /F "skip=1 tokens=*" %%G IN ( %%A ) DO ECHO %%G;!attr!;!date_! >> Operatori_FULL.tmp
)
REN Operatori_FULL.tmp Operatori_FULL.csv
但是代码片段只删除了字符串的第一部分(A2A_41;希望这将接近您想要的内容(不确定您是否需要
attr
):
子例程getLast
将把date
带到其最后一个组件(由下划线分隔)。它的操作是:当date\uu
中有下划线时,它将其拆分为“第一个标记”和“所有其余标记”,并将date\u
设置为“所有其余标记”。当没有(更多)下划线时,日期
保留其原始值的最后一个以下划线分隔的部分
“下划线剥离代码”需要是一个“子例程”,因为(据我所知)不能在外部
中为循环使用标签。希望这将接近您想要的(不确定attr
是否是您需要的):
子例程getLast
将把date
带到其最后一个组件(由下划线分隔)。它的操作是:当date\uu
中有下划线时,它将其拆分为“第一个标记”和“所有其余标记”,并将date\u
设置为“所有其余标记”。当没有(更多)下划线时,日期
保留其原始值的最后一个以下划线分隔的部分
“下划线剥离代码”需要是一个“子例程”,因为(据我所知)您不能在外部中使用标签来进行循环。这里有一个可能的解决方案,用换行符临时替换每个
:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“STRING=%~1”&rem//(第一个参数作为输入字符串)
设置“CHAR=\\&rem//(这是感兴趣的字符)
rem//生成换行符:
(一套)=^
%=空行=%
^")
rem/*用换行符替换每个预定义字符,
rem并将每一行字符串部分括在““””内;
rem处理空字符串时需要这些引号:*/
setlocal EnableDelayedExpansion
如果已定义字符串集^“字符串=^”!字符串:%CHAR%=^“^%LF%%LF%^”^"^"
rem/*循环修改字符串中的所有行,然后
rem将每行字符串部分分配给一个变量
移除周围的“rem”;循环完成后,
rem最后一行存储在变量中:*/
对于(“!STRING!”中的/F delims^=^eol^=%%S,请执行以下操作(
端部
设置“LAST=%%~S”
setlocal EnableDelayedExpansion
)
rem//返回最后一个预定义字符后面的字符串部分:
回声(!最后!
端部
端部
退出/B
这里有一个可能的解决方案,用换行符临时替换每个\u
:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“STRING=%~1”&rem//(第一个参数作为输入字符串)
设置“CHAR=\\&rem//(这是感兴趣的字符)
rem//生成换行符:
(一套)=^
%=空行=%
^")
rem/*用换行符替换每个预定义字符,
rem并将每一行字符串部分括在““””内;
rem处理空字符串时需要这些引号:*/
setlocal EnableDelayedExpansion
如果已定义字符串集^“字符串=^”!字符串:%CHAR%=^“^%LF%%LF%^”!^”
rem/*循环修改字符串中的所有行,然后
rem将每行字符串部分分配给一个变量
rem周围的“移除”;当循环完成时,
rem最后一行存储在变量中:*/
对于(“!STRING!”中的/F delims^=^eol^=%%S,请执行以下操作(
端部
设置“LAST=%%~S”
setlocal EnableDelayedExpansion
)
rem//返回最后一个预定义字符后面的字符串部分:
回声(!最后!
端部
端部
退出/B
此代码从attr
变量中提取最后一个令牌,并将其存储在date\uu
变量中:
rem split string to get date suffix
set "newAttr="
set "date_="
FOR %%G IN ( "!attr:_=" "!" ) DO (
SET "newAttr=!newAttr!_!date_!"
SET "date_=%%~G"
)
SET "attr=!newAttr:~2!"
如果您只需要最后一个令牌,则代码更简单:
FOR %%G IN ( "!attr:_=" "!" ) DO SET "date_=%%~G"
此代码从attr
变量中提取最后一个令牌,并将其存储在date\uu
变量中:
rem split string to get date suffix
set "newAttr="
set "date_="
FOR %%G IN ( "!attr:_=" "!" ) DO (
SET "newAttr=!newAttr!_!date_!"
SET "date_=%%~G"
)
SET "attr=!newAttr:~2!"
如果您只需要最后一个令牌,则代码更简单:
FOR %%G IN ( "!attr:_=" "!" ) DO SET "date_=%%~G"
我尝试了你的代码,但在每次迭代中变量都不会改变。只需删除第一个标记。我编辑了我的问题。@TedGatiss我更新了代码:我忽略了(重要的)事实,即你已经在for
循环中:这意味着我需要!
而不是%
(看起来像你发现的那样)但是我也不认为标签可以在for
循环中使用,所以我将代码从循环中移出并使用call
。不完全确定attr
是什么,所以可能需要一些调整。我尝试了你的代码,但在每次迭代中变量都不会改变。只需删除第一个标记。我编辑了我的question@TedGatiss我已经更新了代码:我错过了(重要的)事实,即你已经在for
循环中:这意味着我需要!
而不是%
(看起来像你发现的那样)但我也不认为标签可以在for
循环中使用,因此我将代码移出循环,并使用call
。不确定您需要attr
是什么,因此可能需要一些调整。我感觉您对问题的解决方案考虑过多。如果您至少可以提供示例的话提供这些文件名的输出示例可能有一个更简单的解决方案。我说这句话的唯一原因是因为这两行代码。SET“attr=%%a”
SET“attr=!attr:.csv=!”
你在上一个问题中说:OPERATORS\u APP\u MKT_