gpt4 book ai didi

batch-file - 如何在 Windows 命令行或批处理文件中搜索斜线或冒号的字符串?

转载 作者:行者123 更新时间:2023-12-03 16:27:35 32 4
gpt4 key购买 nike

我正在尝试编写一个接受参数并将其分类为文件夹名称 (FOLDER)、RELATIVE_PATHNAMEABSOLUTE_PATHNAME< 的函数.

到目前为止,我所拥有的是:

@echo off
call :classifyInput C:\Users\MikeW
echo C:\Users\MikeW is of type %_inputType%
call :classifyInput documentation
echo documentation is of type %_inputType%
goto :EOF

:classifyInput
SETLOCAL
set _inputType=
rem // a string is a "name of folder" iff it has no '/', '\\' or ':' in it, and a pathname otherwise
echo %1%|findstr /i [\/:] >nul
if %errorlevel% == 1 set _inputType=FOLDER
echo %errorlevel%
rem // a string is a "relative pathname" iff it has no ':' as its second character, and an absolute pathname otherwise
if _inputType == [] & "%1:~2,1% == :" (
_inputType=ABSOLUTE_PATHNAME
echo You gave me absolute pathname.
)

ENDLOCAL & set _inputType=%_inputType%

到目前为止,我的函数在这两种情况下的行为方式相同。

此外,Google 搜索如何查找字符 /\: 没有返回任何有用信息。

最佳答案

要回答您的问题以使用 findstr 查找字符 /\:,您只需使用像这样的正则表达式:

findstr "[\\/:]"

EDIT:或者如果你想在字符串中查找 \\/:在脚本的注释中,您可以使用:

findstr /r "\\\\ / :"

因为 \ 是正则表达式中的转义字符,您需要将它与自身一起转义才能获得真正的 \findstr在其正则表达式中使用空格作为 OR 运算符。

在让您继续之前,我想指出您代码中的一些小错误并帮助您改进它:

  • 比较 _inputType == [] 会将文字字符串“_inputType”与字符串“[]”进行比较。如果要检查变量是否为空,请使用 if defined var ,只有当 %var% 不为空时它才会变为真(使用 if not 用于相反的行为)或使用 if "%var%"== ""。但是请确保使用相同的分隔符,因为 == 运算符将比较每个单个字符:if abc == "abc" 永远不会转会被采纳,但 if "abc"== "abc" 会采纳。

  • 子字符串提取仅适用于使用 set 定义的环境变量。它不适用于参数变量(也不适用于循环变量)。所以 %1:~2,1% 不会得到你想要的。它只会将 %1 替换为其中的参数值,并给出类似 C:\Users\MikeW:~2,1% 的内容。如果你想从一个参数中提取,你必须用参数的值设置一个变量并从该变量中提取:

    set input=%~1
    rem now you can use %input:~2,1%

    在你的代码中,我读到你想要输入的第二个字符:%input:~2,1% 会给你第三个,而不是第二个。在子字符串的情况下,将 %var:~n,k% 读取为第 n 个字符之后的 k 个字符。所以你需要的是 %input:~1,1%

  • 我假设您尝试在此行上执行 AND 操作:

    if _inputType == [] & "%1:~2,1% == :"

    不幸的是,ANDOR 运算符不批量存在,因此您必须“模拟”AND你自己,通过使用连续的 if 语句(在应用上面提出的修改之后):

    set input=%~1
    if not defined _inputType if "%input:~1,1%" == ":"

最后我明白了:

@echo off
call :classifyInput C:\Users\MikeW
echo C:\Users\MikeW is of type %_inputType%
call :classifyInput documentation
echo documentation is of type %_inputType%
call :classifyInput Documents\Folder\inside
echo Documents\Folder\inside is of type %_inputType%
goto :EOF

:classifyInput
SETLOCAL
set _inputType=
set input=%~1

rem // a string is a "name of folder" iff it has no '/', '\\' or ':' in it, and a pathname otherwise
echo %input%|findstr /r "\\\\ / :" >nul
if %errorlevel% == 1 set _inputType=FOLDER

echo %errorlevel%

rem // a string is a "relative pathname" iff it has no ':' as its second character, and an absolute pathname otherwise
if not defined _inputType if "%input:~1,1%" == ":" (
set _inputType=ABSOLUTE_PATHNAME
echo You gave me absolute pathname.
) else (
set _inputType=RELATIVE_PATHNAME
)

ENDLOCAL & set _inputType=%_inputType%

上面的脚本会产生这样的结果:

0
You gave me absolute pathname.
C:\Users\MikeW is of type ABSOLUTE_PATHNAME
1
documentation is of type FOLDER
0
Documents\Folder\inside is of type RELATIVE_PATHNAME

PS:如果你能去掉echo %errorlevel%,你可以像这样简化:classifyInput函数:

:classifyInput
SETLOCAL
set _inputType=
set input=%~1

rem // a string is a "name of folder" iff it has no '/', '\\' or ':' in it, and a pathname otherwise
echo %input%|findstr /r "\\\\ / :" >nul
if %errorlevel% == 1 (
set _inputType=FOLDER
) else (
if "%input:~1,1%" == ":" (
set _inputType=ABSOLUTE_PATHNAME
echo You gave me absolute pathname.
) else (
set _inputType=RELATIVE_PATHNAME
)
)

ENDLOCAL & set _inputType=%_inputType%

关于batch-file - 如何在 Windows 命令行或批处理文件中搜索斜线或冒号的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41527045/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com