Batch file 如何在一个变量中获取字符串的最后一个目录路径,其余的将存储在另一个变量中

Batch file 如何在一个变量中获取字符串的最后一个目录路径,其余的将存储在另一个变量中,batch-file,Batch File,我想使用批处理脚本将字符串分成两部分 例如“aaa\bbb\ccc\ddd\eeee” str1=aaa\bbb\ccc\ddd str2=eeee 有谁能建议我如何将字符串分成两部分吗?@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION 设置“mydir=aaa\bbb\ccc\ddd\eeee” 对于“%c:\%mydir%”中的%%a,执行(设置“str1=%%~pa”和设置“str2=%%~nxa”) 如果“%mydir:~0,1”neq“\”设置“str

我想使用批处理脚本将字符串分成两部分 例如“aaa\bbb\ccc\ddd\eeee” str1=aaa\bbb\ccc\ddd str2=eeee

有谁能建议我如何将字符串分成两部分吗?

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
设置“mydir=aaa\bbb\ccc\ddd\eeee”
对于“%c:\%mydir%”中的%%a,执行(设置“str1=%%~pa”和设置“str2=%%~nxa”)
如果“%mydir:~0,1”neq“\”设置“str1=%str1:~1,-1%
集str
后藤:EOF
足够简单-或者你有没有一个你没有告诉我们的驱动器名或前导
\

编辑以补偿可选的前导\

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
设置“mydir=aaa\bbb\ccc\ddd\eeee”
对于“%c:\%mydir%”中的%%a,执行(设置“str1=%%~pa”和设置“str2=%%~nxa”)
如果“%mydir:~0,1”neq“\”设置“str1=%str1:~1,-1%
集str
后藤:EOF
足够简单-或者你有没有一个你没有告诉我们的驱动器名或前导
\

编辑以补偿可选的引导\

标准方式:

@echo off
setlocal EnableDelayedExpansion

set "string=aaa\bbb\ccc\ddd\eeee"

set "str1="
set "str2="
rem Separate the string in quote-delimited parts at "\" chars and process each part:
for %%a in ("%string:\=" "%") do (
   set "str1=!str1!\!str2!"
   set "str2=%%~a"
)

echo str1 = "%str1:~2%"
echo str2 = "%str2%"
紧凑的形式:

@echo off
setlocal EnableDelayedExpansion

set "string=aaa\bbb\ccc\ddd\eeee"

set "str1="
rem The same, in compact form:
set "str2=%string:\=" & set "str1=!str1!\!str2!" & set "str2=%"

echo str1 = "%str1:~1%"
echo str2 = "%str2%"
如果字符串包含通配符
*?
字符,这些方法将失败。

标准方法:

@echo off
setlocal EnableDelayedExpansion

set "string=aaa\bbb\ccc\ddd\eeee"

set "str1="
set "str2="
rem Separate the string in quote-delimited parts at "\" chars and process each part:
for %%a in ("%string:\=" "%") do (
   set "str1=!str1!\!str2!"
   set "str2=%%~a"
)

echo str1 = "%str1:~2%"
echo str2 = "%str2%"
紧凑的形式:

@echo off
setlocal EnableDelayedExpansion

set "string=aaa\bbb\ccc\ddd\eeee"

set "str1="
rem The same, in compact form:
set "str2=%string:\=" & set "str1=!str1!\!str2!" & set "str2=%"

echo str1 = "%str1:~1%"
echo str2 = "%str2%"

如果字符串包含通配符
*?
字符,则这些方法将失败。

该字符串可能表示某种路径。我假设您希望保留路径的任何相对性质,并且还希望保留任何通配符

如果路径有效,以下内容应该是可靠的。为了保留相对路径,我特意在原始字符串前面加上一个可以轻松删除的无效路径
\\\\

@echo off
setlocal
set "str=%~1"

for /f "delims=" %%A in ("\|%str%") do if "%%~pA" neq "\" (
  for /f "delims=| tokens=1*" %%B in ("%%~pA") do set "str1=%%C"
  set "str2=%%~nxA"
) else (
  set "str1="
  for /f "delims=| tokens=*" %%B in ("%%~nxA") do set "str2=%%B"
)
if not defined str1 goto :done
if "%str1:~1%" neq "" set "str1=%str1:~0,-1%"
:done

:: Display the results
set str
我知道的唯一潜在问题是原始路径无效:

  • /
    字符转换为
    \
  • 连续的
    \
    转换为单个
    \
  • 任何前导的
    |
    都将从“路径”中剥离

大概字符串代表某种路径。我假设您希望保留路径的任何相对性质,并且还希望保留任何通配符

如果路径有效,以下内容应该是可靠的。为了保留相对路径,我特意在原始字符串前面加上一个可以轻松删除的无效路径
\\\\

@echo off
setlocal
set "str=%~1"

for /f "delims=" %%A in ("\|%str%") do if "%%~pA" neq "\" (
  for /f "delims=| tokens=1*" %%B in ("%%~pA") do set "str1=%%C"
  set "str2=%%~nxA"
) else (
  set "str1="
  for /f "delims=| tokens=*" %%B in ("%%~nxA") do set "str2=%%B"
)
if not defined str1 goto :done
if "%str1:~1%" neq "" set "str1=%str1:~0,-1%"
:done

:: Display the results
set str
我知道的唯一潜在问题是原始路径无效:

  • /
    字符转换为
    \
  • 连续的
    \
    转换为单个
    \
  • 任何前导的
    |
    都将从“路径”中剥离

这将把相对路径转换为绝对路径,这意味着当前目录的路径将在str1前面。此外,简单FOR将尝试扩展通配符-最好使用FOR/F。另外,为什么在不使用它时启用延迟扩展?如果原始路径包含
,则延迟扩展将导致结果损坏@dbenham:将保留相对路径。我的错误。你是对的。我没有仔细阅读你的代码。但是,您的代码有相反的问题。值
\A\b\c\d\e
错误地为str1生成
A\b\c\d
,而此时它应该生成
\A\b\c\d
。保留根\的唯一时间是原始字符串包含驱动器时。我认为正确的解决方案应该区分
abc
\abc
@dbenham:当然可以。有时,您必须在符合规范的解决方案和考虑逻辑或预期变化的解决方案之间进行选择。一方面,你必须经受住后续“但如果”的考验。另一方面,你没有得到任何回应或“那太复杂了”。这两种方式都不会赢,但这就是生活。这将把相对路径转换为绝对路径,这意味着当前目录的路径将前置到str1。此外,简单FOR将尝试扩展通配符-最好使用FOR/F。另外,为什么在不使用它时启用延迟扩展?如果原始路径包含
,则延迟扩展将导致结果损坏@dbenham:将保留相对路径。我的错误。你是对的。我没有仔细阅读你的代码。但是,您的代码有相反的问题。值
\A\b\c\d\e
错误地为str1生成
A\b\c\d
,而此时它应该生成
\A\b\c\d
。保留根\的唯一时间是原始字符串包含驱动器时。我认为正确的解决方案应该区分
abc
\abc
@dbenham:当然可以。有时,您必须在符合规范的解决方案和考虑逻辑或预期变化的解决方案之间进行选择。一方面,你必须经受住后续“但如果”的考验。另一方面,你没有得到回应或“那太复杂了”。这两种方法都不会赢,但这就是生活。当前代码还有一个额外的限制,即包含
的值将被损坏。我看不出这个解决方案有什么“标准”。但如果您不违反任何限制,它肯定是有效的。当前代码还有一个额外的限制,即包含
的值将被损坏。我看不出这个解决方案有什么“标准”。但是,如果你没有遇到任何限制,它肯定是有效的。谢谢大家的回复。谢谢大家的回复。