5

MicrosoftAccess.ldbロックファイルを読み取るためのバッチファイルを作成しようとしています。ロックファイルには、コンピューター名とユーザー名のリストが含まれています。コンピューター名を抽出し、最終的に外部コマンドに対して実行したいと思います。

バッチファイルの形式は、(1)コンピューター名(2)NULL文字(16進数00)(3)約20個のスペース(4)ユーザー名(5)NULL文字(6)約20の単一行です。スペースが繰り返されます。

(NUL)16進数00を表すNotepad++の例:

COMPUTER0123(NUL)管理者(NUL)COMPUTER0507(NUL)管理者(NUL)

ファイルを読み取るためにを使用していくつかの方法を試しましFORたが、最初のコンピューター名を通り抜けることができません。

setlocal EnableDelayedExpansion
set file = database.ldb

for / F %% a in('type%file%')do(
    エコー%%a
    )。

ほとんどのAccessデータベースでは、ファイル内のユーザー名はですAdminFINDファイルに「Admin」がいくつ含まれているか(プラス1)を使用して確認できました。

for /f "delims=" %%n in ('find /c /v "Admin" %file%') do set "len=%%n"
set "len=!len:*:=!"
echo %len% (minus 1) computer names to process 
<%file% (
  for /l %%l in (1 1 !len!) do (  
    set "line="
    set /p "line="
    echo(!line!)    
    )
)

見つかった行を反復処理しても機能しません。おそらく、ファイルに1行しかないためです(キャリッジリターンはありません)。

WindowsXPの標準インストールで動作するソリューションを見つけたいと思います。


受け入れられた回答を受け取った後、私はそれを以下に投稿するバッチファイルに結合しました。ファイルに名前を付けてShowUsersInLDB.batSendToフォルダーに配置しました。

@echo off
::===================================================================
:: Put this in your SendTo folder and it will let you right-click 
:: on an Access .ldb/.laccdb lock file and tell you the computer
:: names that have opened the database.  
::
:: After the computer names are shown, this will prompt you to 
:: search for the user names associated with each computer.  This
:: depends upon finding a 3rd party file named NetUsers.exe in
:: the user profile folder.  Feel free to change the path if you
:: want to store the file in another location.
:: 
:: NetUsers.exe can be downloaded from here:  http://www.optimumx.com/downloads.html#NetUsers
::
:: Notes:
:: 1) Keep in mind that sometimes after people leave the database 
:: the lock file still shows their computer name.  Don't jump
:: to conclusions.
:: 2) NetUsers.exe seems to report all users who have logged on
:: to the computer and not logged off, including services.  
:: If you aren't familiar with your user names or your users are
:: sharing remote desktops/Citrix/Terminal Services, you may have 
:: to guess who might have created the lock entry. 
::
:: Installation:
:: You may find a batch file named Install_UsersInLDB.bat that will 
:: copy this file to the SendTo folder and the NetUsers.exe file to 
:: the user profile (or a place you define).
::
:: Ben Sacherich - March 2014
:: Please let me know if you have any ideas for improvements.
::===================================================================

setlocal
set file="%1"

:: Make sure the file has a compatible extension.
if  "%~x1"==".ldb"    goto :ExtensionIsValid
if  "%~x1"==".laccdb" goto :ExtensionIsValid

echo.
echo "%~n1%~x1" is not the correct file type.
echo.
pause
goto :End

:ExtensionIsValid
echo The Access "%~n1%~x1" file contains
echo the following computer names:
echo.
set "compNameLine=1"
for /f %%A in ('more "%file%"') do (
  if defined compNameLine (
    echo %%A
    set "compNameLine="
  ) else set "compNameLine=1"
)

echo.
echo Are you ready to look up the user names on each computer?
pause

set "compNameLine=1"
for /f %%A in ('more "%file%"') do (
  if defined compNameLine (
    ::echo %%A
    "%userprofile%\netusers" \\%%A
    set "compNameLine="
  ) else set "compNameLine=1"
)

echo.
echo -- Validation finished at %time%  
pause
:End
exit
4

1 に答える 1

4

CMD.EXEは通常、NULバイトではうまく機能しません。ただし、NULバイトを処理できる外部コマンドがいくつかあります。

また、「線」の長さについても心配する必要があります。CMD.EXEは、8191バイトより長い行を好みません。

NULを新しいラインに変換するので、あなたの最善の策はMOREだと思います。

以下はあなたのコンピュータ名をエコーするはずです。

@echo off
setlocal
set "file=database.ldb"
set "compNameLine=1"
for /f %%A in ('more "%file%"') do (
  if defined compNameLine (
    echo %%A
    set "compNameLine="
  ) else set "compNameLine=1"
)
于 2012-12-12T18:38:57.103 に答える