使用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
答案 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 /?
可能会显示出来。您也可以使用find
(find /?
) - 但如果您使用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
)。