我的 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%