按特殊字符 '\.' 拆分字符串
Split string by special characters '\.'
我有一个以 \.
结尾的字符串。我只想要 \.
之前的字符串
例如:
我的字符串是:D:\Work\WelCome\.
输出字符串应为:D:\Work\WelCome
如果您觉得这个问题很笼统,请原谅。我搜索了按特殊字符拆分字符串的网络,但没有得到预期的结果。
我对批处理脚本不是很陌生,但不够专业。
我已经测试了这段代码并且它有效:
setlocal enabledelayedexpansion
set p=D:\Work\WelCome\.
set v=
:: v is the output
for %%a in (%p:.= %) do (
set "v=!v!.%%~a"
set q=%%~a
if "!q:~-1!"=="\" goto :end
)
:end
set v=%v:~1%
set v=%V:~0,-1%
echo %v%
以下是我用过的案例:
C:\> split.bat C:\.
C:
C:\> split.bat C:\.4\
C:
C:\> split.bat C:\.4\.6
C:
C:\> split.bat C:.\ .3.\...4\.5
C:.\ .3.
C:\> split.bat C:\.1\
C:
这正是您要找的。如果您想对变量做更多的事情,那么只需 echo
它只是指该行后面的 %v%
。
作为 file/folder 路径,让 os 为您解决它比拆分字符串更容易(如果您只需要左侧部分)
for %%a in ("D:\Work\WelCome\.") do echo %%~fa
在理论上结束点可以包含附加数据(但不再有反斜杠)的情况下,这可以转换为
rem The string with more data
set "myString=D:\Work\WelCome\.blah"
for %%a in ("%myString%.@\..") do echo %%~fa
附加的 @
确保总是有附加信息(这样以前的点结尾的情况仍然有效),for
命令将看到一个文件引用,我们只需要得到对父文件夹的引用。
但是请注意,这只是一种清理 file/folder 引用的方法,而不是一种在精确字符上拆分字符串的方法。
拆分字符串的简单解决方案(或者更准确地说,删除后缀)
@echo off
setlocal enableextensions disabledelayedexpansion
rem The string
set "myString=D:\Work\WelCome\.test"
rem Do the split
set "myString=%myString:\.="&rem %"
set "myString=%myString%"
rem Show data
echo %myString%
它将拆分子字符串替换为命令连接和注释开头 (rem
)。所以
set "myString=D:\Work\WelCome\.test"
转换为
set "myString=D:\Work\WelCome"& rem test"
这样,在下一行中,当变量赋值给自身时,不需要的部分将被删除(被rem
隐藏)。
@ECHO OFF
SETLOCAL
SET "string=D:\Work\WelCome\."
:: Classic solution if the string is in an environment variable
ECHO %string:~0,-2%
:: solution if the string is in a metavariable
FOR %%z IN ("%string%") DO ECHO %%z becomes %%~dpnz
GOTO :EOF
这应该是不言自明的。
我有一个以 \.
结尾的字符串。我只想要 \.
例如:
我的字符串是:D:\Work\WelCome\.
输出字符串应为:D:\Work\WelCome
如果您觉得这个问题很笼统,请原谅。我搜索了按特殊字符拆分字符串的网络,但没有得到预期的结果。
我对批处理脚本不是很陌生,但不够专业。
我已经测试了这段代码并且它有效:
setlocal enabledelayedexpansion
set p=D:\Work\WelCome\.
set v=
:: v is the output
for %%a in (%p:.= %) do (
set "v=!v!.%%~a"
set q=%%~a
if "!q:~-1!"=="\" goto :end
)
:end
set v=%v:~1%
set v=%V:~0,-1%
echo %v%
以下是我用过的案例:
C:\> split.bat C:\.
C:
C:\> split.bat C:\.4\
C:
C:\> split.bat C:\.4\.6
C:
C:\> split.bat C:.\ .3.\...4\.5
C:.\ .3.
C:\> split.bat C:\.1\
C:
这正是您要找的。如果您想对变量做更多的事情,那么只需 echo
它只是指该行后面的 %v%
。
作为 file/folder 路径,让 os 为您解决它比拆分字符串更容易(如果您只需要左侧部分)
for %%a in ("D:\Work\WelCome\.") do echo %%~fa
在理论上结束点可以包含附加数据(但不再有反斜杠)的情况下,这可以转换为
rem The string with more data
set "myString=D:\Work\WelCome\.blah"
for %%a in ("%myString%.@\..") do echo %%~fa
附加的 @
确保总是有附加信息(这样以前的点结尾的情况仍然有效),for
命令将看到一个文件引用,我们只需要得到对父文件夹的引用。
但是请注意,这只是一种清理 file/folder 引用的方法,而不是一种在精确字符上拆分字符串的方法。
拆分字符串的简单解决方案(或者更准确地说,删除后缀)
@echo off
setlocal enableextensions disabledelayedexpansion
rem The string
set "myString=D:\Work\WelCome\.test"
rem Do the split
set "myString=%myString:\.="&rem %"
set "myString=%myString%"
rem Show data
echo %myString%
它将拆分子字符串替换为命令连接和注释开头 (rem
)。所以
set "myString=D:\Work\WelCome\.test"
转换为
set "myString=D:\Work\WelCome"& rem test"
这样,在下一行中,当变量赋值给自身时,不需要的部分将被删除(被rem
隐藏)。
@ECHO OFF
SETLOCAL
SET "string=D:\Work\WelCome\."
:: Classic solution if the string is in an environment variable
ECHO %string:~0,-2%
:: solution if the string is in a metavariable
FOR %%z IN ("%string%") DO ECHO %%z becomes %%~dpnz
GOTO :EOF
这应该是不言自明的。