我正在编写简单的脚本来检查可用驱动器中是否存在某个文件夹。 但是,当与“:\ 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
)
)
)
答案 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循环中设置和使用变量需要WMIC
或ENABLEDELAYED EXPANSION
。
CALL