从 svn 控制台输出中提取文件名

从 svn 控制台输出中提取文件名

我的 Tortoise SVNSVN update命令通常会返回以下输出:

C:\proj>svn update
Updating '.':
A 'some-file1.txt'
D 'some-file2.txt'
Restored 'some-file3.txt'
U 'some'file4.txt'
C 'some file5.txt' B
At revision 123.

请注意,除了第一行(始终以 开头Updating)和最后一行(始终以 开头At)之外,每行始终包含:

  • 第一列中的操作。可以是字母或单词
  • 第二列中的文件,用单引号括起来。不幸的是,文件名中可以​​包含单引号或空格!
  • 可能还有更多包含单个字母的列。但我不关心它们。

在我正在编写的批处理文件中,我需要包含操作和文件。我设法获取了操作,但文件似乎对我来说太棘手了。从技术上讲,我想要的只是行中第一个单引号和最后一个单引号之间的所有内容

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('"svn update"') DO (
    set line=%%a
    for /f "tokens=1" %%b in ("!line!") do (
        set action=%%b
        if "!action!" neq "Updating" (
            if "!action!" neq "At" (
                set file= >>> I DON'T KNOW WHAT TO DO HERE <<<
                echo We did !action! to !file!
            )
        )
    )
)

一旦该批处理文件正常工作,它应该输出:

We did A on some-file1.txt
We did D on some-file2.txt
We did Restored on some-file1.txt
We did U on some'file1.txt
We did C on some file1.txt

答案1

我似乎找到了一个使用 powershell 的解决方案,方法是set file=用以下内容替换该行

for /f "delims=" %%c in ('"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command ""$Env:line -replace '^^[^^'']*''' -replace '''[^^'']*$'"" "') DO (
    set file=%%c
)

Powershell 接受%line%(在那里它被称为$Env:line),并^[^']*'用空替换,并'[^']*$用空替换,然后返回字符串,然后for /f再次捕获该字符串并放入%file%

相关内容