2013-03-06 5 views
1

我有一個批處理文件,用於檢查登錄的用戶是否是特定用戶。無論我做什麼批處理文件總是在行上崩潰。我已經花了五個小時的時間,而且我已經完全縮小並改進了它們的命令,但它仍然不起作用。我會很感激我如何能得到它的工作有什麼建議(也,如果我做顯然愚蠢的,讓我知道,我是怎樣的一個虛設的,當涉及到批處理文件):批處理文件IF ELSE失敗

@ECHO OFF 
:: 
SETLOCAL 
:: 
IF "%USERNAME%" EQU "jdoe" (
    IMDISK -a -s 32M -m #: -p "/FS:exFAT /Q /Y /V:MERGEABLES" 
    FOR /F "tokens=2 delims==" %%D IN ('WMIC LOGICALDISK WHERE "size=33538048" GET Name /format:value'^) DO (
     COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Merge PDFs.lnk" "%%D\Merge PDFs.lnk" 
     GOTO End 
    ^) 
) ELSE (
    IMDISK -a -s 256M -m #: -p "/FS:exFAT /Q /Y /V:RAMDRIVE" 
    FOR /F "tokens=2 delims==" %%D IN ('WMIC LOGICALDISK WHERE "size=268304384" GET Name /format:value'^) DO (
     COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Archive Folders.lnk" "%%D\Archive Folders.lnk" 
     GOTO End 
    ^) 
) 
:: 
:End 
:: 
IF EXIST "%SystemDrive%\BGInfo.exe" (
    "%SystemDrive%\BGInfo.exe" "%SystemDrive%\BGInfo.bgi" /Timer:0 /AcceptEula /Silent 
) 
:: 
ENDLOCAL 

UPDATE

所以,我改寫了我的版本,老實說,我不認爲我的原文和改寫相差無幾,但重寫工作。然而,最終我不能使用這個腳本,因爲微軟提供了一個問題。問題是普通用戶不允許格式化驅動器。從窗口拋出IMDISK,現在我必須弄亂隱藏的文件夾和快捷方式等RUNAS沒有幫助,我無法讓它工作。我很確定我搞砸了,但我沒有看到在追求修復方面的重要性。對於任何關心的人,這裏是腳本的最終版本。也許這將幫助別人:

@ECHO OFF 
:: 
IF /I "%USERNAME%" EQU "jdoe" (
    IMDISK -a -s 32M -m #: -p "/FS:exFAT /Q /Y /V:MERGEABLES" 
:: 
    TIMEOUT 4 
:: 
    FOR /F "tokens=2 delims==" %%D IN (
     'WMIC LOGICALDISK WHERE "size=33423360" GET Name /format:value' 
    ) DO (
     PUSHD %%D 
:: 
     COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Merge PDFs.lnk" "Merge PDFs.lnk" 
:: 
     POPD 
:: 
     GOTO End 
    ) 
) ELSE (
    IMDISK -a -s 256M -m #: -p "/FS:exFAT /Q /Y /V:RAMDRIVE" 
:: 
    TIMEOUT 4 
:: 
    FOR /F "tokens=2 delims==" %%D IN (
     'WMIC LOGICALDISK WHERE "size=268304384" GET Name /format:value' 
    ) DO (
     PUSHD %%D 
:: 
     COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Archive Folders.lnk" "Archive Folders.lnk" 
:: 
     POPD 
:: 
     GOTO End 
    ) 
) 
:: 
:End 
:: 
IF EXIST "%SystemDrive%\BGInfo.exe" (
    "%SystemDrive%\BGInfo.exe" "%SystemDrive%\BGInfo.bgi" /Timer:0 /AcceptEula /Silent 
) 

一件事,我無法弄清楚是怎麼到%%D變量從環路直接傳遞給COPY命令。這就是爲什麼我使用PUSHDPOPD,但這只是感覺髒......

+0

你可以嘗試把'而不是僅僅'SETLOCAL' SETLOCAL ENABLEDELAYEDEXPANSION'。我不知道它是否會起作用。 – 2013-03-06 05:21:34

+0

我也嘗試過,但它沒有改變,所以我刪除了它。 – Gup3rSuR4c 2013-03-06 16:00:37

回答

1

您的IF語句似乎是c orrect。我試了一下(在Windows 7上)IMDISK和FOR循環註釋掉,它工作得很好。這是我跑的批次。

@ECHO OFF 
:: 
SETLOCAL 
:: 
IF "%USERNAME%" EQU "jdoe" (
    ECHO jdoe User Found 
    REM IMDISK -a -s 32M -m #: -p "/FS:exFAT /Q /Y /V:MERGEABLES" 
    REM FOR /F "tokens=2 delims==" %%D IN ('WMIC LOGICALDISK WHERE "size=33538048" GET Name /format:value'^) DO (
    REM  COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Merge PDFs.lnk" "%%D\Merge PDFs.lnk" 
    REM  GOTO End 
    REM ^) 
) ELSE (
    ECHO User Not Found 
    REM IMDISK -a -s 256M -m #: -p "/FS:exFAT /Q /Y /V:RAMDRIVE" 
    REM FOR /F "tokens=2 delims==" %%D IN ('WMIC LOGICALDISK WHERE "size=268304384" GET Name /format:value'^) DO (
    REM  COPY "\\WIN2K8R2-F-01\Remote Applications\Batches\Archive Folders.lnk" "%%D\Archive Folders.lnk" 
    REM  GOTO End 
    REM ^) 
) 
:: 
:End 
:: 
IF EXIST "%SystemDrive%\BGInfo.exe" (
    REM "%SystemDrive%\BGInfo.exe" "%SystemDrive%\BGInfo.bgi" /Timer:0 /AcceptEula /Silent 
) 
:: 
ENDLOCAL 

您的IMDISK調用看起來很標準。在那裏看不到任何錯誤,但我沒有測試它的能力。

我會仔細看看FOR循環。根據我的經驗,當你將它們嵌套在其他塊中時,FOR循環很敏感。我經常會得到各種奇怪的結果。嘗試將FOR循環放入單獨的批處理文件中進行測試並找出任何錯誤。

如果您可以讓FOR循環在單獨的批處理文件中工作,但仍不在IF ELSE語句中,請嘗試將CALL設置爲包含IMDISK和FOR循環語句的標籤。出於某種原因,使用CALL語句可以更好地處理嵌套。

下面是使用CALL子程序的引用:http://www.quepublishing.com/articles/article.aspx?p=1154761&seqNum=11

+0

我重寫了我的版本,它看起來很像你的,它工作,但我發現其他問題,不幸的是阻止我繼續前進。我會更新關於這些問題的問題。 – Gup3rSuR4c 2013-03-07 17:11:36

4

如果我是你,我會刪除所有的圓括號。

脫字符轉義下一個字符的特殊意義 - 這意味着「這個系統字符字面意思

順便說一句 - 你可以格式化

for /f ... in ('whatever...') do (

for /f ... in (
    'whatever...' 
) do (

,如果你想 - 可能會使它更具可讀性...

+0

我接受了你的建議,並將'FOR'分成幾行。肯定更清晰。 – Gup3rSuR4c 2013-03-06 18:28:48