0

我正在编写简单的脚本来检查可用驱动器中是否存在某个文件夹。但是,如果我只是回显 %%G,则在与 ":\somefolder" 连接时,%%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
        )
     )
)
4

3 回答 3

0

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

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

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%G IN ('powershell -NoLogo -NoProfile -Command ^
        "(Get-CIMInstance -ClassName Win32_LogicalDisk).DeviceID"') DO (
    SET "VAR=%%G\somefolderpath"
    IF EXIST "!VAR!" (
        echo "!VAR!" found
    ) ELSE (
        echo "!VAR!" not found
    )
)
于 2019-07-01T02:43:45.890 回答
0

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

另外,请注意,这[%%G]将永远 =[]仅在一个非常具体的场景中,您不正确地设置For循环标记,因此它们具有重叠的范围可能会创建空变量。

在您的循环中,这是不可能的,因为您只需选择 allll 令牌,完全有效。 For循环不匹配除了被视为分隔符(默认为空格)之外没有其他字符的行。

无论如何,我们可以安全地放弃那部分。

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

直接检查:

 @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 变量,我们需要使用!而不是%

于 2019-07-01T02:29:37.980 回答
0

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

在一个块语句(a parenthesised series of statements)中,整个块被解析然后执行。块中的任何内容都将在解析%var%块时替换为该变量的值- 在执行块之前 - 同样适用于.FOR ... DO (block)

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

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

在您的情况下,var不需要设置 -if exist "%%G\somefolderpath"就足够了。

另请注意,将带引号的字符串分配给变量会使变量难以在逻辑上组合。根据需要插入引号要简单得多。语法SET "var=value"(其中值可能为空)用于确保分配的值中不包含任何杂散的尾随空格。

于 2019-07-01T02:21:52.147 回答