2014-07-18 89 views
1

我一直在使用這個網站一段時間,並發現它非常有價值的找到腳本問題的解決方案。今天我決定提出一個問題,因爲我在這裏度過了3天,超級用戶和谷歌搜索之後還沒有找到我的解決方案。關於我所有這些,現在我的觀點...Windows FOR命令不擴展系統環境變量

我有幾個安裝程序,每個程序稍微不同的版本或風味。每個安裝都有一個文本文件,用於定義其使用的變量。其中一個變量爲用戶特定設置定義了一個文件夾,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命令行。

回答

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 
+0

感謝您的快速回復。我選擇這個答案是最好的,因爲它打開了我的想法,使用子程序。我遇到了額外的環境變量,例如CSIDL_APPDATA,它不會在命令提示符下展開。 – keNscale

0

我只是以前RD

....CALL RD ... 

插入CALL雖然我也想嘗試

....CALL ECHO(RD ... 

首先要驗證 - 只是爲了安全起見。

+0

很好的答案。這比其他更簡單。感謝您的回覆如此之快。我確實喜歡上面的答案中的子程序的想法。你的答案也是一樣的!是的,爲了安全起見,rd/s/q可以非常無情。 – keNscale