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