1

ログインしているユーザーが特定のユーザーであるかどうかを確認するために構成しているバッチファイルがあります。私が何をしても、バッチファイルは常に) ELSE (行でクラッシュします。私はこれに 5 時間費やしましたが、以前のコマンドよりも確実にコマンドを縮小および改善しましたが、まだ機能していません。それを機能させる方法についての提案をいただければ幸いです(また、私が明らかに愚かなことをしている場合は、お知らせください。バッチファイルに関しては、私は一種のダミーです):

@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

アップデート

それで、私は自分のバージョンを書き直しましたが、正直なところ、オリジナルと書き直しの間に大きな違いは見られませんが、書き直しはうまくいきました. ただし、Microsoft の厚意により、このスクリプトを使用することはできません。問題は、通常のユーザーがドライブをフォーマットできないことです。それはウィンドウを投げ出し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 ステートメントでは動作しない場合は、IMDISK および FOR ループ ステートメントを含むラベルへの CALL を設定してみてください。何らかの理由で、CALL ステートメントを使用すると、ネストがより適切に処理されます。

CALL サブルーチンを使用するためのリファレンスは次のとおりです: http://www.quepublishing.com/articles/article.aspx?p=1154761&seqNum=11

于 2013-03-06T05:26:54.417 に答える