Batch file 批处理-删除范围/特定单词

Batch file 批处理-删除范围/特定单词,batch-file,perforce,changelist,unshelve,Batch File,Perforce,Changelist,Unshelve,在perforce中,我使用以下批处理脚本打印文件的搁置/更改列表: for %%A IN (%ShelvedCHL%) DO ( echo Change List: %%A p4 -p %PPort% -c %PClient% unshelve -s %%A && if NOT %ERRORLEVEL%==0 exit -1 )>> list.txt 这是我的list.txt 更改名单:24536 //GSA/TOC.h#1 - unshelve

在perforce中,我使用以下批处理脚本打印文件的搁置/更改列表:

for %%A IN (%ShelvedCHL%) DO (
    echo Change List: %%A 
    p4 -p %PPort% -c %PClient% unshelve -s %%A && if NOT %ERRORLEVEL%==0 exit -1
)>> list.txt
这是我的list.txt

更改名单:24536

//GSA/TOC.h#1 - unshelved, opened for edit
... /GSA/TOC.h - also opened by test@dev
... /GSA/TOC.h - also opened by test@dev
//odata/oenums.h#6 - unshelved, opened for edit
... //odata/oenums.h#6 - also opened by test@dev
我希望有以下输出,基本上用破折号删除后面的句子:或者甚至任何perforce命令,以获得更少的信息和文件列表:

 //GSA/TOC.h#1 
 ... /GSA/TOC.h
 ... /GSA/TOC.h
 //odata/oenums.h#6
 ... //odata/oenums.h#6

我将感谢任何帮助,提前谢谢

首先,让我们看看您的代码:

  • 我不知道程序
    p4
    ,但我假设它正在设置。因此,由于此值是在您想要读取它的同一代码块中更新的,因此您需要使用,因此将
    setlocal EnableDelayedExpansion
    放在脚本顶部并使用
    !错误等级而不是
    %ErrorLevel%
    。如果不是,另一种方法是更换
    !错误等级==0
    not ErrorLevel 1
    表示,这意味着如果
    ErrorLevel
    不大于且不等于
    1
    ,或者如果
    ErrorLevel
    小于
    1
    ,则以更简单的方式表示,但这仅在程序未设置负值时有效
  • 即使您纠正了
    ErrorLevel
    问题,也不会执行
    if
    查询,因为这只允许在前一个命令成功的情况下执行以下命令,这意味着其退出代码1等于零。因此,要执行
    if
    语句,请使用无条件运算符
    &
    。无论如何,还有另一个条件运算符
    |
    ,它只允许在退出代码为非零值时执行以下命令;如果
    条件完全满足,则此项可以替代您的
  • exit
    命令不仅退出批处理文件,还终止批处理脚本运行的命令提示符(
    cmd
    )实例。要退出批处理文件,请改用
    exit/B
  • 您正在通过
    退出-1
    错误级别设置为
    -1
    。当然,您可以这样做,但通常可以避免负值;因此,让我建议一个正值,如
    1
    (通过
    exit/b1
  • 您正在为每个迭代打开和关闭文件
    list.txt
    。这会降低总体性能。此外,如果
    list.txt
    已经存在,则数据将被追加;如果您不想这样做,则需要将
    del“list.txt”2>nul
    放在
    for
    循环之前,以最初删除文件。无论如何,要一次写入整个文件,请在
    for
    循环周围再加一对括号。然后,您可以选择是使用附加到已存在的文件,还是使用运算符
    覆盖它(无需先删除它)
  • 所有这些都会导致以下改进脚本:

    (对于(%ShelvedCHL%)中的%%A(
    回显更改列表:%%A
    p4-p%PPort%-c%p客户端%unshelve-s%%A | |退出/B 1
    ))>“list.txt”
    
    根据
    %ShelvedCHL%
    包含的内容(在示例数据中似乎是
    24536
    ,因此不是文件路径/名称/掩码),
    for
    循环甚至可能是多余的,尽管我现在还不知道


    无论如何,以上所有内容都还没有考虑到以空格+
    -
    +空格开头的部分字符串的删除,所以现在让我们实现这一点:

    为了简单起见,我们可以使用此代码在上述代码之后修改文件
    list.txt
    (请参阅所有解释性
    rem
    注释;所提到的字符串操作称为):

    rem//逐行读取文件`list.txt`:
    (对于/F“usebackq delims=eol=|”%%L in(“list.txt”)do(
    rem//将行字符串指定给变量:
    设置“行=%%L”
    rem//启用延迟扩展以能够执行字符串操作:
    setlocal EnableDelayedExpansion
    rem/*用一个字符`|``替换所有出现的“-`,然后使用这个字符
    rem作为分隔符将行字符串拆分为'for/F'需要单个字符
    rem分隔符;仅使用“-”是不好的,因为它们可能出现在部分
    我认为需要保留的rem字符串;“|”不能出现在其中:*/
    对于/F“tokens=1 delims=| eol=|”%%K in(“!LINE:-=|!”)do(
    rem//禁用延迟扩展以不丢失“!”标记:
    端部
    rem//返回拆分字符串,即(第一个)`-``前面的部分:
    回声%%K
    )
    ))>“list_NEW.txt”
    
    结果数据包含在文件
    list\u NEW.txt
    中。要将其保存在原始文件中,请在代码后附加以下行:

    move/Y“list\u NEW.txt”“list.txt”>nul
    


    1。。。通常退出代码和
    ErrorLevel
    是相同的,但实际上在一些罕见的情况下,它们可能会有所不同。

    首先,让我们看看您的代码:

  • 我不知道程序
    p4
    ,但我假设它正在设置。因此,由于此值是在您想要读取它的同一代码块中更新的,因此您需要使用,因此将
    setlocal EnableDelayedExpansion
    放在脚本顶部并使用
    !错误等级而不是
    %ErrorLevel%
    。如果不是,另一种方法是更换
    !错误等级==0
    not ErrorLevel 1
    表示,这意味着如果
    ErrorLevel
    不大于且不等于
    1
    ,或者如果
    ErrorLevel
    小于
    1
    ,则以更简单的方式表示,但这仅在程序未设置负值时有效
  • 即使您纠正了
    ErrorLevel
    问题,也不会执行
    if
    查询,因为这只允许在前一个命令成功的情况下执行以下命令,这意味着其退出代码1等于零。因此,要执行
    if
    语句,请使用无条件运算符