Windows FOR命令不扩展系统环境变量

时间:2014-07-18 21:08:05

标签: batch-file

我一直在使用这个网站,并发现它在寻找脚本问题的解决方案方面非常有价值。今天我决定提出一个问题,因为我在这里度过了3天后,在超级用户和谷歌搜索中找不到我的解决方案。关于我的所有事情,现在我的意思......

我有几个程序安装,每个版本或风格略有不同。每个安装都有一个文本文件,用于定义其使用的变量。其中一个变量定义了用户特定设置的文件夹USERSET=%APPDATA%\foo1\foo2。加班这些用户设置可能会损坏。我希望能够使用批处理文件或脚本删除这些文件夹。简而言之,我想在目录中搜索包含特定字符串的文本文件,该字符串设置指向文件夹的变量,获取该变量的值并使用它来删除目录。

这是我到目前为止所做的:

for /f "tokens=2 delims==" %%G in ('dir /b /s c:\foo\*.txt ^| findstr /i /f:/ userset') do rd /s /q %%G

输出如下:

H:\>rd /s /q %appdata%\foo1\foo2\USERSET   
The system cannot find the file specified.

显然%appdata%不会扩展?

当然,如果我只是在命令提示符下键入rd /s /q %appdata%\foo1\foo2\USERSET,它就会起作用。

我对其他语言开放,我大多熟悉Windows命令行。

2 个答案:

答案 0 :(得分:1)

这是因为环境变量扩展是在语句的分析时完成的。当您的for循环正在运行且%%G实际上获得了值时,为时已晚;变量已经扩展。

你可以用子程序解决这个问题,我想:

pushd C:\foo
for /f ...  %%G in (...) do call :process "%%G"
popd
goto :eof

:process
  call set "X=%~1"
  rd /s /q "%X%"
  goto :eof

答案 1 :(得分:0)

我只需在CALL

之前插入RD
....CALL RD ...

虽然我也试过

....CALL ECHO(RD ...

首先要验证 - 为了安全起见。