Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件计数令牌数_Windows_Batch File_Cmd - Fatal编程技术网

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_