2012-10-06 175 views
0

我創建了一個批處理文件,用於在Windows中搜索用戶桌面文件夾。變量內部變量?

for /F "skip=2 tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%a 

如果我的桌面文件夾不在C:\Users\User\Desktop,它會工作,並在我的情況E:\User\Desktop返回正確的文件夾,例如。如果桌面文件夾位於C:\Users\User\Desktop,則上面的腳本將生成%USERPROFILE%\Desktop。稍後在腳本中,我嘗試在桌面上創建一個新文件。在第一個選項中它會起作用,因爲E:\User\Desktop是一個真正的目錄。在第二個它不會因爲明顯%USERPROFILE%\Desktop不算作目錄。

echo start javaw -jar "path/to/program.jar" >"%DESKTOP%\Start program.bat" 

如何讓它適用於這兩種情況?

if /I "%DESKTOP%" EQU "%USERPROFILE%\Desktop" 

沒有幫助,因爲它是一樣的

if /I "%DESKTOP%" EQU "C:\Users\User\Desktop" 

回答

2

你可以使用call擴大變量:
call set desktop=%desktop%

+0

+1;當我被要求爲家人做早餐時,我會提供這個答案的擴展版本。大聲笑 – dbenham

2

你需要一個額外的圓的正常擴張。正如wmz已經回答的那樣,你可以通過使用CALL來獲得額外的回合。

對於在文件夾和文件名中有效的特殊字符,如&^,應該小心。我建議在您的作業中使用引號來保護特殊字符。

call set "DESKTOP=%DESKTOP%" 

我假設DESKTOP的值不包含引號。如果您有混合的定義,有時包括引號,其他時間則不包含所有投注。

假設DESKTOP=This & that\%VAR%VAR=& the other thing。使用CALL引用分配的最終結果將是正確的:This & that\& the other thing

我在真實世界中的文件夾名稱中看到過&,所以引號是一件好事。但是,如果您的值包含^,則會出現問題。引用^如果通過CALL傳遞,則加倍。

假設DESKTOP=one^two%var%VAR=^three,使用CALL的引用賦值的最終結果將是one^^two^three

我不認爲我曾經在文件夾名中碰到過^,但這是可能的,並且有一個解決方案。您可以使用CMD/C進行另一輪擴展,並使用FOR/F來捕獲結果。

以下將給出one^two^three的正確結果。我使用"eol=:",因爲有效路徑永遠無法以:開頭。

for /f "eol=: delims=" %%B in ('cmd /c echo "%DESKTOP%"') do set "DESKTOP=%%~B" 

您不需要使用DESKTOP的中間分配。在上述所有方面,您可以用您的FOR/F %%a替代%DESKTOP%