/ f批处理将所有可用驱动器迭代到seach文件夹

时间:2019-06-30 23:10:16

标签: batch-file cmd delayedvariableexpansion

我正在编写简单的脚本来检查可用驱动器中是否存在某个文件夹。 但是,当与“:\ somefolder”连接时,%% G总是显示空字符串 如果我只是回声%% G,它将显示所有可用的驱动器。 我是批处理脚本的新手,不确定在这里缺少什么。

先谢谢了。

@echo off 
   ::parse the VER command 
   FOR /F "tokens=*" %%G IN ('wmic logicaldisk get caption') DO (
    IF [%%G]==[] (
                    echo "empty string"
    ) ELSE (

        SET var="%%G\somefolderpath"
        IF EXIST %var% (
            echo %var% found
        ) ELSE (
            echo %var% not found
        )
     )
)

3 个答案:

答案 0 :(得分:0)

通常的做法是在最初的setlocal之后直接使用@echo off命令。这会丢弃批处理结束时对环境所做的任何更改,因此由一个批处理文件建立的变量不会影响可能在同一会话中运行的任何其他批处理。

在块语句(a parenthesised series of statements)中,整个块被解析并然后执行。块中的任何%var%都会在解析该块时被该变量的值取代-在执行该块之前-同样的情况适用于FOR ... DO (block)。 / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

克服此问题的两种常见方法是:1)使用setlocal enabledelayedexpansion(在块之外或通常在初始@echo off之后)并使用!var!代替{{1} },以访问%var%或2)的更改后的值,以调用子例程以使用更改后的值执行进一步的处理。

对于您来说,不需要设置var-var就足够了。

还请注意,将带引号的字符串分配给变量会使变量难以逻辑组合。根据需要插入引号要简单得多。语法if exist "%%G\somefolderpath"(值可以为空)用于确保分配的值中不包含任何杂散尾随空格。

答案 1 :(得分:0)

除非使用延迟扩展或执行call echo.

,否则您将无法设置变量并在循环中读取其内容。

此外,请注意,[%%G]永远不会= [],这只是在非常特殊的情况下,您不正确地设置了For循环令牌,因此它们的重叠范围重叠会产生空的可变变量。

在循环中是不可能的,因为您只选择完全有效的alll令牌。 For循环与那些除了delim(默认为空白)之外没有其他字符的行不匹配。

无论如何,我们可以放心地删除那部分。

让我们展示一些示例,说明如何执行此操作

直接检查:

 @echo off 
 Set "_Dir=Some\Folder\Path"
 FOR /F "tokens=*" %%G IN ('
   wmic logicaldisk get caption
 ') DO (
    IF EXIST "%%G\%_Dir%" (
       ECHO."%%G\%_Dir%" Exists!
    ) ELSE (
       ECHO."%%G\%_Dir%" Does Not Exist!
    )
 )

设置该变量并在循环中使用它:

 @(
   SetLocal EnableDelayedExpansion
   echo off
 )
 Set "_Dir=Some\Folder\Path"
 FOR /F "tokens=*" %%G IN ('
   wmic logicaldisk get caption
 ') DO (
    SET "_Path=%%G\%_Dir%"
    IF EXIST "!_Path!" (
       ECHO."!_Path!" Exists!
    ) ELSE (
       ECHO."!_Path!" Does Not Exist!
    )
 )

请注意,为了在循环中使用rhe变量,我们需要使用!而不是%

答案 2 :(得分:0)

这是另一种方法。 re.compile()命令已弃用。 https://itknowledgeexchange.techtarget.com/powershell/wmic-deprecated/

正如其他人所提到的,在FOR循环中设置和使用变量需要WMICENABLEDELAYED EXPANSION

CALL