按特殊字符 '\.' 拆分字符串

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

这应该是不言自明的。