Batch file 如何删除批处理路径中最后一个反斜杠后的所有字符

Batch file 如何删除批处理路径中最后一个反斜杠后的所有字符,batch-file,path,virtual-machine,powershell,Batch File,Path,Virtual Machine,Powershell,编辑:%%a的值为 <MachineEntry uuid="{awae1979-6512-4br8-acg5-3oe94f56712de}" src="C:\Users\John\VirtualBox VMs\VM\VM.vbox"/> 在我的示例代码中,它提供了Users\John\VirtualBox VMs\VM\VM.vbox。它只会将C:\关闭。我想让它把最后一个\切下来,给我C:\Users\John\VirtualBox VMs\VM。关于如何让代码从行的末尾而不是从

编辑:
%%a的值为

<MachineEntry uuid="{awae1979-6512-4br8-acg5-3oe94f56712de}" src="C:\Users\John\VirtualBox VMs\VM\VM.vbox"/>

在我的示例代码中,它提供了
Users\John\VirtualBox VMs\VM\VM.vbox
。它只会将
C:\
关闭。我想让它把最后一个
\
切下来,给我
C:\Users\John\VirtualBox VMs\VM
。关于如何让代码从行的末尾而不是从开头进行迭代,有什么想法吗?欢迎任何意见或建议

使用双引号作为分隔符不是更容易吗


@For/F Tokens^=4Delims^=^“%%A In('Find“src=“^使用双引号作为分隔符不是更容易吗


@For/F Tokens^=4Delims^=^“%%A In('Find“src=“^您可以使用
=
/
作为分隔符来提取引用的路径,然后让它们执行其工作:

for/F“tokens=3 delims==/”%%L in('findstr/I“src=”“VirtualBox.xml“')do(
回显完整路径:%%~L
回显文件名:%%~nxL
回显目录路径:%%~dpL
)

您可以使用
=
/
作为分隔符来提取引用的路径,然后让

for/F“tokens=3 delims==/”%%L in('findstr/I“src=”“VirtualBox.xml“')do(
回显完整路径:%%~L
回显文件名:%%~nxL
回显目录路径:%%~dpL
)

我的解决方案正在批处理文件中使用:

@echo off
for /F "tokens=3 delims=/=" %%I in ('%SystemRoot%\System32\findstr.exe /I /L "src" VirtualBox.xml') do set "VirtualBoxPath=%%~dpI"
echo Virtual box path is: "%VirtualBoxPath%"
FORwith option
/F
在这种情况下,在后台启动一个新的命令进程,该进程使用
%ComSpec%/c
和两个
'
之间的命令行,在圆括号内附加了安装在
c:\Windows
中的窗口,以执行:

C:\Windows\System32\cmd.exe /c C:\Windows\System32\findstr.exe /I /L "src" VirtualBox.xml
FINDSTR不区分大小写搜索当前目录中文件
VirtualBox.xml
中包含文本字符串
src
的行,该文件也可以是与包含批处理文件的目录不同的目录。在这种情况下,FINDSTR输出以处理后台com的STDOUT和处理生产线:

<MachineEntry uuid="{awae1979-6512-4br8-acg5-3oe94f56712de}" src="C:\Users\John\VirtualBox VMs\VM\VM.vbox"/>
FOR默认情况下也会忽略以分号开头的所有行,因为
eol=;
是行结束选项的默认值。此处不能更改行结束选项,因为要处理的XML行从不以
开头

在real中,FOR首先使用指定的或默认的字符串分隔符拆分行,然后检查第一个子字符串是否以指定的或默认的行尾字符开头。因此,在这种情况下,FOR也会忽略以
=/;
开头的行,因为
=
e> /
将在行拆分过程中被删除,然后第一个子字符串以
开头;
尽管行本身以
=
开头,因此该行被完全忽略,尽管分配给循环变量
I
应该是第三个子字符串,而不是第一个子字符串

分配给循环变量
I
的字符串用
%%~dp
引用,使用三个修饰符:

  • 第一个是
    ~
    ,它导致从分配给循环变量
    I
    的字符串中删除周围的
  • 第二个是
    d
    ,意思是带冒号的驱动器号
  • 第三个是
    p
    ,表示没有驱动器号和冒号的路径。
    路径是直到最后一个反斜杠的所有内容,包括最后一个反斜杠
因此,字符串
C:\Users\John\VirtualBox-VMs\VM\
被分配给环境变量
VirtualBox-path


一般来说,如果指定给循环变量的字符串确实引用了现有文件或文件夹,则对该字符串应用修饰符并不重要。FOR在文件系统中指定给引用的循环变量的字符串中找不到任何文件/文件夹,则对字符串本身应用修饰符。当然,文件/f如果分配给循环变量的字符串引用的旧文件不完整,则必须存在,就像没有文件扩展名的文件名被分配给循环变量一样,并且需要的是驱动器、路径或文件扩展名。在这种情况下,FOR访问文件系统以获取不完整文件名字符串的完整限定文件名,并尽最大努力设置所需数据。

我的解决方案正在批处理文件中使用:

@echo off
for /F "tokens=3 delims=/=" %%I in ('%SystemRoot%\System32\findstr.exe /I /L "src" VirtualBox.xml') do set "VirtualBoxPath=%%~dpI"
echo Virtual box path is: "%VirtualBoxPath%"
FORwith option
/F
在这种情况下,在后台启动一个新的命令进程,该进程使用
%ComSpec%/c
和两个
'
之间的命令行,在圆括号内附加了安装在
c:\Windows
中的窗口,以执行:

C:\Windows\System32\cmd.exe /c C:\Windows\System32\findstr.exe /I /L "src" VirtualBox.xml
FINDSTR不区分大小写搜索当前目录中文件
VirtualBox.xml
中包含文本字符串
src
的行,该文件也可以是与包含批处理文件的目录不同的目录。在这种情况下,FINDSTR输出以处理后台com的STDOUT和处理生产线:

<MachineEntry uuid="{awae1979-6512-4br8-acg5-3oe94f56712de}" src="C:\Users\John\VirtualBox VMs\VM\VM.vbox"/>
FOR默认情况下也会忽略以分号开头的所有行,因为
eol=;
是行结束选项的默认值。此处不能更改行结束选项,因为要处理的XML行从不以
开头

在real中,FOR首先使用指定的或默认的字符串分隔符拆分行,然后检查第一个子字符串是否以指定的或默认的行尾字符开头。因此,在这种情况下,FOR也会忽略以
=/;
开头的行,因为
=
e> /
将在行拆分过程中被删除,然后第一个子字符串以
开头;
尽管行本身以
=
开头,并且由于这个原因,尽管该行被分配给循环变量
I,但会被完全忽略