Windows batchscript:逐行读取文件并提取路径
我想逐行读取文件内容,然后在每一行中只检索路径 sample.txt:Windows batchscript:逐行读取文件并提取路径,windows,parsing,batch-file,Windows,Parsing,Batch File,我想逐行读取文件内容,然后在每一行中只检索路径 sample.txt: \.\docusp\ui\test\java\services\gway->\.\docusp\ui\test\java\pserv\com\controller\services\gway pserver\2 (5660\1) (backed) (elink) \.\docusp\ui\test\java\pserv\services\run->\.\docusp\ui\test\java\pserv\com
\.\docusp\ui\test\java\services\gway->\.\docusp\ui\test\java\pserv\com\controller\services\gway pserver\2 (5660\1) (backed) (elink)
\.\docusp\ui\test\java\pserv\services\run->\.\docusp\ui\test\java\pserv\com\controller\services\rip pserver\1 (376\1) (backed) (elink)
path: \.\docusp\ui\test\java\services\gway
target: \.\docusp\ui\test\java\pserv\com\controller\services\gway
path: \.\docusp\ui\test\java\pserv\services\run
target:\.\docusp\ui\test\java\pserv\com\controller\services\rip
@echo off
for /f "delims=" %%a in (C:\sample.txt) DO (
ECHO Line is: %%a
set line=%%a
for /f "tokens=1,2 delims=->" %%a in ("%line%") do (
echo %%a
echo %%b
set path=%%a
set target=%%b
REM target contains the substring after ->. Want to remove "pserver\2 (5660\1) (backed) (elink)" string
)
)
输出:
\.\docusp\ui\test\java\services\gway->\.\docusp\ui\test\java\pserv\com\controller\services\gway pserver\2 (5660\1) (backed) (elink)
\.\docusp\ui\test\java\pserv\services\run->\.\docusp\ui\test\java\pserv\com\controller\services\rip pserver\1 (376\1) (backed) (elink)
path: \.\docusp\ui\test\java\services\gway
target: \.\docusp\ui\test\java\pserv\com\controller\services\gway
path: \.\docusp\ui\test\java\pserv\services\run
target:\.\docusp\ui\test\java\pserv\com\controller\services\rip
@echo off
for /f "delims=" %%a in (C:\sample.txt) DO (
ECHO Line is: %%a
set line=%%a
for /f "tokens=1,2 delims=->" %%a in ("%line%") do (
echo %%a
echo %%b
set path=%%a
set target=%%b
REM target contains the substring after ->. Want to remove "pserver\2 (5660\1) (backed) (elink)" string
)
)
测试。蝙蝠:
\.\docusp\ui\test\java\services\gway->\.\docusp\ui\test\java\pserv\com\controller\services\gway pserver\2 (5660\1) (backed) (elink)
\.\docusp\ui\test\java\pserv\services\run->\.\docusp\ui\test\java\pserv\com\controller\services\rip pserver\1 (376\1) (backed) (elink)
path: \.\docusp\ui\test\java\services\gway
target: \.\docusp\ui\test\java\pserv\com\controller\services\gway
path: \.\docusp\ui\test\java\pserv\services\run
target:\.\docusp\ui\test\java\pserv\com\controller\services\rip
@echo off
for /f "delims=" %%a in (C:\sample.txt) DO (
ECHO Line is: %%a
set line=%%a
for /f "tokens=1,2 delims=->" %%a in ("%line%") do (
echo %%a
echo %%b
set path=%%a
set target=%%b
REM target contains the substring after ->. Want to remove "pserver\2 (5660\1) (backed) (elink)" string
)
)
在目标包含的每一行中
\.\docusp\ui\test\java\pserv\com\controller\services\rip pserver\1 (376\1) (backed) (elink)
需要删除pserver\1(376\1)(backed)(elink)
,目标应该只包含\。\docusp\ui\test\java\pserv\com\controller\services\rip
注意:目标路径之间可能包含空格。基于空间和get子字符串将不起作用
非常感谢您的帮助。这里的问题是您不清楚问题的重要细节,因此我必须猜测以下两点:
- 如提供的sample.txt文件所示,目标和要删除的零件之间的间隔为两个空格
- 当你说“目标路径可能包含中间的空间”时,我假设目标路径可能包含中间的一个空间,而不是两个相邻的空间
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%a in (sample.txt) DO (
ECHO Line is: %%a
set line=%%a
for /f "tokens=1,2 delims=->" %%a in ("!line: =-!") do (
echo path: %%a
echo target: %%b
)
)
这里的问题是,您不清楚问题的重要细节,因此我必须对以下两点进行猜测:
- 如提供的sample.txt文件所示,目标和要删除的零件之间的间隔为两个空格
- 当你说“目标路径可能包含中间的空间”时,我假设目标路径可能包含中间的一个空间,而不是两个相邻的空间
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%a in (sample.txt) DO (
ECHO Line is: %%a
set line=%%a
for /f "tokens=1,2 delims=->" %%a in ("!line: =-!") do (
echo path: %%a
echo target: %%b
)
)
这不是免费的代码编写服务,您发布的代码不会尝试您在问题中列出的任务。在您尝试让代码执行并完成任务失败之前,您的问题在这里是离题的。我还建议,您应该考虑使用Windows脚本主机或PuthSek进行此任务,而不是批处理文件。您似乎误解了<代码> Delims<代码> > <代码> > /f>代码>;它指定用作分隔符的字符列表,但不指定字符串……尽管在本例中,由于它们是这些字符的唯一可见实例,它应正确标识路径,而不应将其命名为该路径,因为它将覆盖现有系统变量,而
target
应该包含行的其余部分(为了进一步细化),但是为了实现这一点,您还需要启用并使用延迟扩展!这不是免费的代码编写服务,您发布的代码不会尝试您在问题中列出的任务。在您尝试让代码执行并完成任务失败之前,您的问题在这里是离题的。我还建议,您应该考虑使用Windows脚本主机或PuthSek进行此任务,而不是批处理文件。您似乎误解了<代码> Delims<代码> > <代码> > /f>代码>;它指定用作分隔符的字符列表,但不指定字符串……尽管在本例中,由于它们是这些字符的唯一可见实例,它应正确标识路径,而不应将其命名为该路径,因为它将覆盖现有系统变量,而target
应该包含行的其余部分(为了进一步细化),但是为了实现这一点,您还需要启用并使用延迟扩展!非常感谢。成功了。基本上我不熟悉批处理脚本。使用(“!line:pserver=-!”)代替(“!line:pserver=-!”)。因为在我的例子中,pserver在每一行中都是常量,它不会在路径中。我认为在这种情况下,你得到的目标路径在末尾有两个空格…谢谢。成功了。基本上我不熟悉批处理脚本。使用(“!line:pserver=-!”)代替(“!line:pserver=-!”)。因为在我的例子中,pserver在每一行中都是常量,它不会在路径中。我认为在这种情况下,你得到的目标路径的末尾有两个空格。。。