我配置了一个批处理文件,以检查登录的用户是否是特定用户。无论我做什么,批处理文件总是在) 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命令。所以我才用PUSHD和POPD,但这感觉很脏.
发布于 2013-03-06 05:26:54
您的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循环在一个单独的批处理文件中工作,但仍然不能在您的If ELSE语句中工作,请尝试设置对包含IMDISK和FOR循环语句的标签的调用。由于某些原因,使用CALL语句可以更好地处理嵌套。
下面是使用调用子例程的参考:http://www.quepublishing.com/articles/article.aspx?p=1154761&seqNum=11
发布于 2013-03-06 05:24:22
如果我是你,我会删除括号前的所有插入符号。
插入符号回避了下一个字符的特殊含义--它的意思是“这个字符字面上”。
顺便说一下-你可以
for /f ... in ('whatever...') do (作为
for /f ... in (
'whatever...'
) do (如果你愿意的话-可能会让它更容易读懂.
https://stackoverflow.com/questions/15239357
复制相似问题