批处理文件IF ELSE失败

时间:2013-03-06 05:03:05

标签: batch-file

我有一个批处理文件,我正在配置它以检查登录的用户是否是特定用户。无论我做什么,批处理文件总是在) 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

更新

所以,我改写了我的版本,说实话,我没有看到我的原版和重写之间有太大的区别,但重写有效。但是,最后我不能使用这个脚本,因为有一个问题由微软提供。问题是不允许普通用户格式化驱动器。这会抛出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,但这只是感觉很脏......

2 个答案:

答案 0 :(得分:4)

如果我是你,我会在封闭括号之前删除所有的插入符号。

插入符号逃脱了下一个字符的特殊含义 - 这意味着'这个字面意思'

顺便说一句 - 你可以格式化

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

作为

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

如果你愿意 - 可能会让它更具可读性......

答案 1 :(得分:1)

您的IF声明似乎是正确的。我尝试了(在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循环语句的Label。出于某种原因,使用CALL语句可以更好地处理嵌套。

以下是使用CALL子例程的参考:http://www.quepublishing.com/articles/article.aspx?p=1154761&seqNum=11