Batch file 批处理循环删除字符串包含空格时的字符崩溃

Batch file 批处理循环删除字符串包含空格时的字符崩溃,batch-file,Batch File,我有一个循环,它删除\字符以及字符串中字符前面的所有内容,直到它不包含任何内容 它工作正常,直到字符串中出现空格,例如TEST-areach.txt,导致它崩溃 这是什么原因?还有没有更好的方法来测试字符串是否包含\字符 以下是我正在使用的代码: set INPUT=E:\FOLDERA\FOLDERB\TEST.TXT echo %INPUT% SET OUTPUT=%INPUT% :AGAIN SET OUTPUT=%OUTPUT:*\=% if not x%OUTPUT:\=%==x%O

我有一个循环,它删除
\
字符以及字符串中字符前面的所有内容,直到它不包含任何内容

它工作正常,直到字符串中出现空格
,例如
TEST-areach.txt
,导致它崩溃

这是什么原因?还有没有更好的方法来测试字符串是否包含
\
字符

以下是我正在使用的代码:

set INPUT=E:\FOLDERA\FOLDERB\TEST.TXT
echo %INPUT%
SET OUTPUT=%INPUT%

:AGAIN
SET OUTPUT=%OUTPUT:*\=%
if not x%OUTPUT:\=%==x%OUTPUT% (
GOTO AGAIN
)
echo %OUTPUT%
pause

使用
if
比较两件事时,请始终使用引号

if not "%OUTPUT:*\=%"=="%OUTPUT%" (

当%OUTPUT%包含空格时,批处理将
if not xTEST
作为命令读取,这是无效语法。

在使用
if
比较两个内容时,始终使用引号

if not "%OUTPUT:*\=%"=="%OUTPUT%" (

当%OUTPUT%包含空格时,批处理将
如果不是xTEST
作为命令读取,这是无效的语法。

您遇到的问题是因为您没有使用双引号保护变量和字符串

建议使用以下语法执行此操作:

@Echo关闭
设置“Input=E:\FoderA\FolderB\Test Loop.txt”
回显%输入%
设置“输出=%Input%”
:循环
设置“输出=%Output:\=%”
如果/I不是“x%输出:\=%”==“x%输出%”(
转到环路
)
回显%输出%
暂停
退出/B
您还要求提供一种方法来测试字符串是否包含
\
字符;您可以这样做:

@Echo关闭
如果不是“%Input:\=%”,则为“%Input%”(Echo包含\),否则Echo不包含\
暂停
你还问是否有更好的方法

您可以使用内置元变量修改器,如下所示:

@Echo关闭
设置“Input=E:\FolderA\FolderB\Test.txt”
对于(“%Input%”)中的%%A,请设置“Output=%%~nxA”
回显%输出%
暂停
以下是主要的修改器:

%~A-展开%A,删除任何周围的引号(“)
%~fA-将%A扩展为完全限定的路径名
%~dA-仅将%A扩展为驱动器号
%~pA-仅将%A扩展到路径
%~nA-仅将%A扩展为文件名
%~xA-仅将%A扩展为文件扩展名
因为您使用了术语输入,如果它作为输入参数,
%1
,那么您可以直接修改该元变量参数:

@Echo关闭
回显输入为:%~1
回波输出为%nx1
暂停
正如您在我的示例中所看到的,可以组合修改器以获得复合结果:

%~dpA-仅将%A扩展为驱动器号和路径
%~nxA-仅将%A扩展为文件名和扩展名
最后,如果你想变得真正有创造力,并且感到困惑,你也可以这样做:

@Echo关闭
设置“Input=E:\FolderA\FolderB\Test.txt”
设置“输出=%Input:\=”&设置“输出=%”
回显%输出%
暂停

您遇到的问题是,您没有使用双引号保护变量和字符串

建议使用以下语法执行此操作:

@Echo关闭
设置“Input=E:\FoderA\FolderB\Test Loop.txt”
回显%输入%
设置“输出=%Input%”
:循环
设置“输出=%Output:\=%”
如果/I不是“x%输出:\=%”==“x%输出%”(
转到环路
)
回显%输出%
暂停
退出/B
您还要求提供一种方法来测试字符串是否包含
\
字符;您可以这样做:

@Echo关闭
如果不是“%Input:\=%”,则为“%Input%”(Echo包含\),否则Echo不包含\
暂停
你还问是否有更好的方法

您可以使用内置元变量修改器,如下所示:

@Echo关闭
设置“Input=E:\FolderA\FolderB\Test.txt”
对于(“%Input%”)中的%%A,请设置“Output=%%~nxA”
回显%输出%
暂停
以下是主要的修改器:

%~A-展开%A,删除任何周围的引号(“)
%~fA-将%A扩展为完全限定的路径名
%~dA-仅将%A扩展为驱动器号
%~pA-仅将%A扩展到路径
%~nA-仅将%A扩展为文件名
%~xA-仅将%A扩展为文件扩展名
因为您使用了术语输入,如果它作为输入参数,
%1
,那么您可以直接修改该元变量参数:

@Echo关闭
回显输入为:%~1
回波输出为%nx1
暂停
正如您在我的示例中所看到的,可以组合修改器以获得复合结果:

%~dpA-仅将%A扩展为驱动器号和路径
%~nxA-仅将%A扩展为文件名和扩展名
最后,如果你想变得真正有创造力,并且感到困惑,你也可以这样做:

@Echo关闭
设置“Input=E:\FolderA\FolderB\Test.txt”
设置“输出=%Input:\=”&设置“输出=%”
回显%输出%
暂停