1

我有一个批处理文件,我正在配置它来检查登录的用户是否是特定用户。无论我做什么,批处理文件总是) 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命令。这就是我使用PUSHDand的原因POPD,但这只是感觉很脏......

4

2 回答 2

4

如果我是你,我会删除右括号前的所有插入符号。

插入符号转义了下一个字符的特殊含义——它的意思是“这个字符字面意思”

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

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

作为

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

如果您愿意-可能会使它更具可读性...

于 2013-03-06T05:24:22.230 回答
1

您的 IF 语句似乎是正确的。我在 IMDISK 和 FOR 循环注释掉的情况下尝试了它(在 Windows 7 上),它工作得很好。这是我运行的批次。

@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

于 2013-03-06T05:26:54.417 回答