2013-03-06 134 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