Странное значение при разборе вывода в пакетном скрипте Windows - PullRequest
0 голосов
/ 08 марта 2019

Попытка создать скрипт для разблокировки всех заблокированных файлов в папке с помощью Windows handle.exe.Но когда я разделяю вывод, значение имени файла становится ... странным (все остальные значения в порядке).

Пример вывода handle.exe таков:

REM  perl.exe           pid: 12532  type: File          PCNAME\UserName          144: C:\dev\massunlocker\Eula.txt
REM  a perl.exe
REM  b pid:
REM  c 12532
REM  d type:
REM  e File
REM  f PCNAME\UserName
REM  g 144:
REM  h C:\dev\massunlocker\Eula.txt

Такиз этого мне нужно c, g и h.

@echo off
setlocal EnableDelayedExpansion

for /f "tokens=1,2,3,4,5,6,7,8 delims= " %%a in ( 'handle64.exe C:\dev\massunlocker\sample-dir -u -nobanner' ) do (
    REM echo a = "%%a"
    REM echo b = "%%b"
    REM echo c = "%%c"
    REM echo d = "%%d"
    REM echo e = "%%e"
    REM echo f = "%%f"
    REM echo g = "%%g"
    REM echo h = "%%h"
    echo [%%h]
)


:end
setlocal DisableDelayedExpansion

Первые 2 в порядке, но %%h хм странно (отредактировано)?

]C:\dev\massunlocker\sample-dir\ae\pdf
]C:\dev\massunlocker\sample-dir
]C:\dev\massunlocker\sample-dir\ae

Почему это не так?:

[C:\dev\massunlocker\sample-dir\ae\pdf]
[C:\dev\massunlocker\sample-dir]
[C:\dev\massunlocker\sample-dir\ae]

И я не могу проверить, является ли он каталогом или файлом, например, для not exist это всегда так.

Редактировать: вот выходной пример сстроки без комментариев:

a = "cmd.exe"
b = "pid:"
c = "1624"
d = "type:"
e = "File"
f = "PCNAME\UserName"
g = "1FC:"
" = "C:\dev\massunlocker\sample-dir

обратите внимание на последнюю строку ...

PS Ручка инструмента

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Следующий фрагмент кода может помочь.

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion

for /f "tokens=1-7,* delims= " %%a in ('
    handle64.exe C:\Windows\System32\en-US\Kernel -u -nobanner
  ' ) do (

    REM echo a = "%%a" 
    REM echo b = "%%b"
    REM echo c = "%%c"
    REM echo d = "%%d"
    REM echo e = "%%e"
    REM echo f = "%%f"
    REM echo g = "%%g"
    REM echo h = "%%h"
    for /F "tokens=*" %%H in ("%%~h") do echo h="%%H"  a="%%a"
)

Здесь петли for равны

  • %%a для получения выходных значений handle64.exe;
  • %%H для удаления окончания возврат каретки в значении %%h, возвращаемом в конце строки.Поведение

wmichandle64): каждая строка вывода заканчивается 0x0D0D0A (<CR><CR><LF>) вместо обычного 0x0D0A (<CR><LF>).

См. Дейва Бенхама WMIC и FOR /F: исправление для проблемы <CR>

Вывод (усеченный):

==> D:\bat\SO\55065841.bat
h="C:\Windows\System32\en-US\KernelBase.dll.mui"  a="GoldenDict.exe"
h="C:\Windows\System32\en-US\KernelBase.dll.mui"  a="chrome.exe"
h="C:\Windows\System32\en-US\kernel32.dll.mui"  a="chrome.exe"
h="C:\Windows\System32\en-US\KernelBase.dll.mui"  a="AppleChromeDAV.exe"    

==>
1 голос
/ 08 марта 2019

Я не имею в виду это как ответ .. Мне просто нужен форматированный текст.Как указывает Compo ... действительно, в конце вывода 0D 0D 0A, но не в середине, где парсер должен заботиться об этом.

Их парсер должен быть лучше этого.

Hex dump of the output

В качестве обходного пути (как упоминалось в Compo), возьмите вывод вызова и пропустите его через другой цикл for, он работает просто отлично.Я выполнил приведенный ниже вызов функции.

@echo off
Set THE_DIR=%TEMP%

for /f "delims=" %%a in ( 'handle64.exe %THE_DIR% -u -nobanner' ) do call :Process_Line "%%a"
goto :EOF

:Process_Line 
for /f "tokens=1,2,3,4,5,6,7,8 delims= " %%a in ( 'echo %*' ) do (
echo a = "%%a"
echo b = "%%b"
echo c = "%%c"
echo d = "%%d"
echo e = "%%e"
echo f = "%%f"
echo g = "%%g"
echo h = "%%h"
)
goto :EOF
1 голос
/ 08 марта 2019

Вывод, который вы испытываете, такой же, как мы получаем из вывода wmic.exe в цикле For. Поэтому я предполагаю, что handle64.exe также выводит дополнительные <CR>.

Если это так, вы должны запустить результат через дополнительный цикл For, так же, как если бы это было WMIC. Взгляните на некоторые WMIC примеры на этом сайте, чтобы найти примеры его использования. В качестве альтернативы посмотрите на эту тему на dostips.com .

Вот пример его использования:

For /F "Tokens=*" %%A In ('
    handle64.exe C:\dev\massunlocker\sample-dir -u -nobanner
')Do For /F "Tokens=1-8" %%B In ("%%A")Do (Rem Echo B = "%%B"
    Rem Echo C = "%%C"
    Rem Echo D = "%%D"
    Rem Echo E = "%%E"
    Rem Echo F = "%%F"
    Rem Echo G = "%%G"
    Rem Echo H = "%%H"
    Rem Echo I = "%%I"
    Echo [%%I])
Pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...