Windows批处理 - 检查字符串是否以循环中的...开头

时间:2014-11-16 01:30:32

标签: regex batch-file cmd

使用git ::

从远程分支列表中获取输出
for /f "delims=\" %r in ('git branch -r') do (
::then in here I want to get rid of the origin/HEAD -> line of the output
::and do a few git ops on the other lines, which are the names of branches
)

无论如何,我发现这令人沮丧,因为显然批次没有正则表达式

这里是我在bash中用来执行此操作的代码

for remote in `git branch -r | grep -v '\->'`;
do echo $remote; #...git stuff
done;

grep删除" origin / HEAD - >起源/主" git branch -r

的输出行

所以我希望问一下如何实施'包含'动词

for /f "delims=\" %r in ('git branch -r') do (
if not %r contains HEAD (
::...git stuff
)
)

关于循环变量

this stackoverflow question似乎回答了一个类似的问题,虽然在我试图实现这样的问题时,我对%符号感到困惑,并没有对它们进行排列产生函数

编辑未来的读者:有一些正则表达式将findstr / r传送到git branch -r

2 个答案:

答案 0 :(得分:2)

for /f "delims=\" %%r in ('git branch -r^|findstr "HEAD"') do (
 echo ...git stuff %%r
)

应该给你一个开始。

注意:%%r,而不是批处理文件中的%r - %r可以直接在提示符下使用。

您的delims=\过滤器会生成该部分,直到\中包含git branch -r的任意一行的第一个HEAD - 抱歉,我不会说bash-ish ;你需要准确说出你想要找到的HEAD字符串是什么。

对整行使用"delims=" - 省略delims选项会将分隔符设置为默认值(空格,逗号,分号等)

  • 不要在块(括号内的语句序列)中使用::-comments,因为它实际上是一个损坏的标签,cmd不指定块内的标签。请在此处使用REM条评论。

findstr输出的结果字符串(作用于正则表达式的脑死亡版本)将被处理到echo(或者你可以在这里替换的任何声明) - 如果有的话没有,for似乎会被跳过。

你的目标字符串是findstr我不知道的。从提示中,findstr /?可能会显示出来。您也可以使用findfind /?) - 但如果您使用cygwin,则* nix版本的find会覆盖windows-native。

答案 1 :(得分:1)

我不知道git分支输出是什么样的,但是测试用例是

test 1
HEAD test \-> 2
test 3

test 4

以下打印除包含\->

的文本行以外的所有文本行
@setlocal enableextensions enabledelayedexpansion
@echo off

for /f "tokens=*" %%r in (d:\test2.txt) do (
    set str1=%%r
   if "!str1:\->=!"=="!str1!" (
       echo %%r
   )
)

if测试从根本上做了这个测试:string1.replace("HEAD", "") == string1

如果在命令提示符中直接使用,则循环变量需要为%r,如果在批处理文件中,则为%%r

字符串替换是环境变量的一部分,而不是循环变量,因此需要将其放入保持字符串(str1)中才能使用。如果您启用了命令扩展(enableextensions)。

由于环境变量设置操作在读取脚本时发生,您需要使用enabledelayedexpansion并使用!str1!代替%str1%来覆盖它,否则str1的值会赢得&#39 ; t从一个循环变为下一个循环。

(PS。改为使用PowerShell。Get-Content D:\test2.txt | Select-String "\->" -NotMatch)。