Batch file 批处理-删除范围/特定单词
在perforce中,我使用以下批处理脚本打印文件的搁置/更改列表: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
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
语句,请使用无条件运算符