如何在Windows批处理文件中拆分字符串?

如何在Windows批处理文件中拆分字符串?,windows,string,batch-file,split,Windows,String,Batch File,Split,我试图在Windows批处理文件中拆分并生成一个新字符串,但我不知道如何执行 我正在尝试转换以下内容: Crysis3_2560x1440 为此: Crysis 3 - 2560x1440 HD 7970 CrossFire 然后: HD7970CrossFire 为此: Crysis 3 - 2560x1440 HD 7970 CrossFire 有什么建议吗?编辑:这是管理评论中提到的特殊情况的新版本: @echo off setlocal EnableDelayedExpans

我试图在Windows批处理文件中拆分并生成一个新字符串,但我不知道如何执行

我正在尝试转换以下内容:

Crysis3_2560x1440
为此:

Crysis 3 - 2560x1440
HD 7970 CrossFire
然后:

HD7970CrossFire
为此:

Crysis 3 - 2560x1440
HD 7970 CrossFire

有什么建议吗?

编辑:这是管理评论中提到的特殊情况的新版本:

@echo off
setlocal EnableDelayedExpansion

for /F %%a in (inputFile.txt) do (
   set string=%%a
   echo Original: !string!
   call :Splint string
   echo Modified: !string!
)
goto :EOF

:Splint string
set string=!%1!
rem Change underscore by space-dash-space
set string=%string:_= - %
rem Separate the string at first group of digits or space
for /F "tokens=1* delims=0123456789 " %%a in ("%string%") do (
   set first=%%a
   set last=%%b
)
rem Eliminate first part from middle
set middle=!string:%first%=!
rem Eliminate last part from middle, if exists
if defined last set middle=!middle:%last%=!
rem Eliminate spaces from middle
set middle=%middle: =%
rem Assemble the result
if defined middle (
   set %1=%first% %middle% %last%
) else (
   set %1=%first% %last%
)
exit /B
输出:

Original: Crysis3_2560x1440
Modified: Crysis 3 - 2560x1440
Original: HD7970CrossFire
Modified: HD 7970 CrossFire
Original: Skyrim_2560x1440
Modified: Skyrim - 2560x1440
Original: SleepingDogs_2560x1440
Modified: SleepingDogs - 2560x1440
Original: GTX680
Modified: GTX 680

Antonio

编辑:这是管理评论中提到的特殊情况的新版本:

@echo off
setlocal EnableDelayedExpansion

for /F %%a in (inputFile.txt) do (
   set string=%%a
   echo Original: !string!
   call :Splint string
   echo Modified: !string!
)
goto :EOF

:Splint string
set string=!%1!
rem Change underscore by space-dash-space
set string=%string:_= - %
rem Separate the string at first group of digits or space
for /F "tokens=1* delims=0123456789 " %%a in ("%string%") do (
   set first=%%a
   set last=%%b
)
rem Eliminate first part from middle
set middle=!string:%first%=!
rem Eliminate last part from middle, if exists
if defined last set middle=!middle:%last%=!
rem Eliminate spaces from middle
set middle=%middle: =%
rem Assemble the result
if defined middle (
   set %1=%first% %middle% %last%
) else (
   set %1=%first% %last%
)
exit /B
输出:

Original: Crysis3_2560x1440
Modified: Crysis 3 - 2560x1440
Original: HD7970CrossFire
Modified: HD 7970 CrossFire
Original: Skyrim_2560x1440
Modified: Skyrim - 2560x1440
Original: SleepingDogs_2560x1440
Modified: SleepingDogs - 2560x1440
Original: GTX680
Modified: GTX 680

Antonio

您可以使用这些代码片段作为基础

set in=Crysis3_2560x1440
set out=!in:_= - !
set in
set out
而且

set in=HD7970CrossFire
set out=!in:HD7970CrossFire=HD 7970 CrossFire!
set in
set out
虽然我不明白你为什么不去

set str=HD 7970 CrossFire

您可以使用这些代码段作为基础

set in=Crysis3_2560x1440
set out=!in:_= - !
set in
set out
而且

set in=HD7970CrossFire
set out=!in:HD7970CrossFire=HD 7970 CrossFire!
set in
set out
虽然我不明白你为什么不去

set str=HD 7970 CrossFire

不确定批处理文件,但您可以使用Powershell吗?可能是我还没有尝试过任何东西的副本;我已经用perl和AutoIt编写了一整天的代码,我不能完全理解它。不确定Powershell或它将如何集成。。。?肯:我看到了,但我就是不能把它应用到我的目标上。。。尝试是否要使用同一批处理程序拆分上面的两个字符串?你能用文字而不是举例来解释拆分中使用的方法吗?例如:“在第一组数字处分隔字符串…”Aacini,当然!对于第一次拆分,我们将有一个带有游戏名称和分辨率的字符串,用下划线分隔。在u处拆分游戏名称和分辨率非常简单,我们还希望能够通过intercaps或数字分隔游戏名称。所以Crysis3=Crysis3 FarCry3=FarCry3=FarCry3 SleepingDogs=SleepingDogs对于第二部分,它基本上是第一部分的复制品,需要确保您正确地点击了中间插页。HD7970Crossfire=HD 7970 Crossfire GTX680 GTX680SLI=GTX 680 SLI HD7970=HD 7970不确定批处理文件,但您可以使用Powershell吗?可能是重复的我还没有尝试过任何东西;我已经用perl和AutoIt编写了一整天的代码,我不能完全理解它。不确定Powershell或它将如何集成。。。?肯:我看到了,但我就是不能把它应用到我的目标上。。。尝试是否要使用同一批处理程序拆分上面的两个字符串?你能用文字而不是举例来解释拆分中使用的方法吗?例如:“在第一组数字处分隔字符串…”Aacini,当然!对于第一次拆分,我们将有一个带有游戏名称和分辨率的字符串,用下划线分隔。在u处拆分游戏名称和分辨率非常简单,我们还希望能够通过intercaps或数字分隔游戏名称。所以Crysis3=Crysis3 FarCry3=FarCry3=FarCry3 SleepingDogs=SleepingDogs对于第二部分,它基本上是第一部分的复制品,需要确保您正确地点击了中间插页。HD7970Crossfire=HD 7970 Crossfire GTX680 GTX680SLI=GTX 680 SLI HD7970=HD 7970哇,太棒了!我只是尝试了一下,发现了几个问题,大多数情况下效果都很好。1.“Skyrim_2560x1440”和“SleepingDogs_2560x1440”导致“Skyrim-2560x1440”2。类似地,如果像“GTX680”这样的第二个字符串没有第三部分,我会得到:“Modified:GTX middle:=”非常感谢您的开始@RyanShrout:检查新版本@阿奇尼,看起来好多了!我确实注意到“SleepingDogs”的修改版本并没有分为“SleepingDogs”。还有一个想法是使GPU名称(gtx、hd)更容易。你能搜索“GTX”或“HD”并在那里分开吗?这将允许“GTX泰坦”修改为“GTX泰坦”或“GTX泰坦SLI”修改为“GTX泰坦SLI”。另外,另一个用例是(也是最长的一个)“GTX660TiSLI”到“GTX660TiSLI”。这个地方需要一个小费罐!!哇,太棒了!我只是尝试了一下,发现了几个问题,大多数情况下效果都很好。1.“Skyrim_2560x1440”和“SleepingDogs_2560x1440”导致“Skyrim-2560x1440”2。类似地,如果像“GTX680”这样的第二个字符串没有第三部分,我会得到:“Modified:GTX middle:=”非常感谢您的开始@RyanShrout:检查新版本@阿奇尼,看起来好多了!我确实注意到“SleepingDogs”的修改版本并没有分为“SleepingDogs”。还有一个想法是使GPU名称(gtx、hd)更容易。你能搜索“GTX”或“HD”并在那里分开吗?这将允许“GTX泰坦”修改为“GTX泰坦”或“GTX泰坦SLI”修改为“GTX泰坦SLI”。另外,另一个用例是(也是最长的一个)“GTX660TiSLI”到“GTX660TiSLI”。这个地方需要一个小费罐!!