使用批处理脚本从行查找确切的子字符串

时间:2013-12-25 05:04:58

标签: batch-file

现在我正在尝试编写一个脚本,该脚本将从该行获得精确的字符串。例如:

echo asdf C:\ | findstr /C:"C:\\" 1>nul 
if errorlevel 1 ( echo not found ) else ( echo found )

在上面的脚本中,我只想确保echo命令中存在C:\驱动器。但是当我向echo命令添加一些文本时:

echo asdf C:\sdfdf | findstr /C:"C:\\" 1>nul
if errorlevel 1 ( echo not found ) else ( echo found )

它还告诉我C:\存在。我只想找到确切的字符串。有人可以给我一些建议吗?

先谢谢!

抱歉我的错误代码和英文!

更新

对不起伙计们,

让我解释一下我的想法。我正在进行Windows Server迁移。从旧服务器,我必须将不包含默认共享或远程管理位置的共享文件夹迁移到新服务器。我尝试编写如下所示的批处理脚本来列出我需要迁移的所有共享文件夹,下次我将其修改为自动使用xcopy将其复制到新服务器。但我一直坚持从输出中获取确切的字符串列出我需要的精确共享文件夹。这是我的剧本:

@echo off
setlocal enabledelayedexpansion
REM Get list shared folder
echo:
echo ^<=================Get list shared folder================^>
for /F "tokens=* skip=1" %%i in ('"wmic share get name,path"') do (
    for /F "tokens=1" %%s in ('echo %%i') do (
    REM Check content doesn't contains $ special character, ECHO text
        echo %%s | findstr /C:"$" 1>nul
        REM if not contains $
        if errorlevel 1 (
        REM if not contains ECHO text
            echo %%s | findstr /C:"ECHO" 1>nul
            if errorlevel 1 (
                echo %%i
                echo %%i | findstr /C:"C:\\" 1>nul
                if errorlevel 1 (
                    echo %%i
                )
            )
        )
    )
)
pause

非常感谢你们。大家可以建议我如何找到像D:\,C:..等精确的驱动器。从结果中排除它?

先谢谢!

P / s:对不起我的错误代码和糟糕的英语。

3 个答案:

答案 0 :(得分:0)

您可以将以下(丑陋)正则表达式与findstr一起使用,以返回包含C:\而没有后缀的行:

findstr /i "c:\\[^;0-9a-zA-z-~\-=+']"

正则表达式排除了附加到c:\的任何(合法)字符的行。

/i允许C:\c:\

这会阻止C:\sdfdf之类的匹配。它不会阻止前缀字符,例如2c:\。但是,您可以从上面的正则表达式中收集到如何处理它。

答案 1 :(得分:0)

如果我理解(不确定),问题是确定字符串c:\是否出现在没有任何前缀/后缀的行内。这应该可以解决问题

findstr /i /r /c:" c:\\ " /c:" c:\\$" /c:"^c:\\ " /c:"^c:\\$"

它只处理所有需要的案件:

space         String  space
space         String  EndOfString
StartOfString String  space
StartOfString String  EndOfString

答案 2 :(得分:0)

以这种方式使用WMIC可以为您提供难以解析的输出。它是Unicode,它有尾随空格。

尝试此操作,然后解析生成的文件b.tmp,您可以按Name=Path=

进一步过滤结果
wmic share get name,path /value >a.tmp
type a.tmp |find "=" >b.tmp