简体   繁体   中英

Windows Batch - check if string starts with … in a loop

this grabs the output from a remote branch list with 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
)

anyhow, I'm finding this frustrating as apparently batch doesn't have regex

here's the code I'm using to do this in bash

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

the grep removes the "origin/HEAD -> origin/master" line of the output of git branch -r

So I'm hoping to ask how to implement the 'contains' verb

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

on a loop variable

this stackoverflow question appears to answer a similar question, although in my attempts to implement as such, I became confused by % symbols and no permutation of them yielded function

EDIT FOR FUTURE READERS: there is some regex with findstr /r piped onto git branch -r

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

should give you a start.

Note: %%r , not %r within a batch file - %r would work directly from the prompt.

Your delims=\\ filter will produce that portion up to the first \\ of any line from git branch -r which contains HEAD - sorry, I don't talk bash-ish; you'd need to say precisely what the HEAD string you want to locate is.

Use "delims=" fo the entire line - omitting the delims option will set delimiters to the default set (space, comma, semicolon, etc.)

  • Don't use ::-comments within a block (parenthesised statement-sequence) as it's actually a broken label and cmd doesn't appeciate labels within a block. Use REM comments here instead.

The resultant strings output from the findstr (which acts on a brain-dead verion of regex) will be processed through to the echo (or whatever statement you may substitute here) - if there are none, the for will appear to be skipped.

Quite what your target string would be for findstr I can't tell. From the prompt, findstr /? may reveal. You may also be able to use find ( find /? ) - but if you are using cygwin the *nix version of find overrides windows-native.

I don't know what the git branch output looks like, but with a test case of

test 1
HEAD test \-> 2
test 3

test 4

the following prints all the text lines except the one containing \\->

@setlocal enableextensions enabledelayedexpansion
@echo off

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

The if test is fundamentally doing this test: string1.replace("HEAD", "") == string1 .

Your loop variable needs to be %r if used directly in the command prompt, but %%r if in a batch file.

The string replacement is a part of environment variables, not loop variables, so it needs to be put into a holding string (str1) to work with. If you have the command extensions enabled ( enableextensions ).

And because environment variable setting operations happen when the script is read, you need to override that with enabledelayedexpansion and using !str1! instead of %str1% , otherwise the value of str1 won't change from one loop to the next.

(PS. Use PowerShell instead. Get-Content D:\\test2.txt | Select-String "\\->" -NotMatch ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM