我有一个循环,在字符串中删除\
个字符及其前面的所有字符,直到它不包含任何字符。
它运行正常,直到字符串中有一个空格
,例如TEST AGAIN.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
答案 0 :(得分:2)
您遇到的问题是因为您没有使用双引号来保护变量和字符串。
这样做的推荐语法是:
@Echo Off
Set "Input=E:\FoderA\FolderB\Test Loop.txt"
Echo %Input%
Set "Output=%Input%"
:Loop
Set "Output=%Output:*\=%"
If /I Not "x%Output:\=%"=="x%Output%" (
GoTo Loop
)
Echo %Output%
Pause
Exit /B
您还要求一种方法来测试字符串是否包含\
字符;你可以这样做:
@Echo Off
If Not "%Input:\=%"=="%Input%" (Echo Contains \) Else Echo Does not contain \
Pause
您还询问是否有更好的方法。
你可以使用这样的内置元变量修饰符:
@Echo Off
Set "Input=E:\FolderA\FolderB\Test.txt"
For %%A In ("%Input%") Do Set "Output=%%~nxA"
Echo %Output%
Pause
这些是主要修饰符:
%~A - expands %A removing any surrounding quotes (")
%~fA - expands %A to a fully qualified path name
%~dA - expands %A to a drive letter only
%~pA - expands %A to a path only
%~nA - expands %A to a file name only
%~xA - expands %A to a file extension only
因为您已经使用了术语输入,如果它作为输入参数%1
出现,那么您可以直接修改该元变量参数:
@Echo Off
Echo Input is: %~1
Echo Output is %~nx1
Pause
正如您在我的示例中所看到的,可以组合修饰符以获得复合结果:
%~dpA - expands %A to a drive letter and path only
%~nxA - expands %A to a file name and extension only
最后,如果你想要真正有创意,和困惑,你也可以这样做:
@Echo Off
Set "Input=E:\FolderA\FolderB\Test.txt"
Set "Output=%Input:\="&Set "Output=%"
Echo %Output%
Pause
答案 1 :(得分:1)
在将两件事与if
进行比较时,请始终使用引号。
if not "%OUTPUT:*\=%"=="%OUTPUT%" (
当%OUTPUT%包含空格时,批处理正在读取if not xTEST
作为命令,这是无效的语法。