Странное значение при разборе выходных данных в пакетном скрипте Windows

#windows #batch-file

#Windows #пакетный файл

Вопрос:

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

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

 REM  perl.exe           pid: 12532  type: File          PCNAMEUserName          144: C:devmassunlockerEula.txt
REM  a perl.exe
REM  b pid:
REM  c 12532
REM  d type:
REM  e File
REM  f PCNAMEUserName
REM  g 144:
REM  h C:devmassunlockerEula.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:devmassunlockersample-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:devmassunlockersample-diraepdf
]C:devmassunlockersample-dir
]C:devmassunlockersample-dirae
  

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

 [C:devmassunlockersample-diraepdf]
[C:devmassunlockersample-dir]
[C:devmassunlockersample-dirae]
  

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

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

 a = "cmd.exe"
b = "pid:"
c = "1624"
d = "type:"
e = "File"
f = "PCNAMEUserName"
g = "1FC:"
" = "C:devmassunlockersample-dir
  

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

PS Инструмент обработки

Комментарии:

1. Я не следую вашим примерам. Я не вижу того, что вы думаете partial .

2. @Squashman извините, в некоторых других попытках мой вывод казался частичным. но чем больше я это делаю, тем больше кажется, что это просто по какой-то странной причине неправильно печатается. но тогда проверка с помощью, например, if exist, также не работает.

3. Покажите нам необработанный вывод команды handle. Было бы практически невозможно устранить неполадки, не увидев этого.

Ответ №1:

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

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

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

 For /F "Tokens=*" %%A In ('
    handle64.exe C:devmassunlockersample-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
  

Ответ №2:

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

 @ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion

for /f "tokens=1-7,* delims= " %%a in ('
    handle64.exe C:WindowsSystem32en-USKernel -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 значении, возвращаемом в конце строки.

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

Смотрите WMIC и FOR /F Дейва Бенхэма: Исправление <CR> проблемы с завершением

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

 ==> D:batSO55065841.bat
h="C:WindowsSystem32en-USKernelBase.dll.mui"  a="GoldenDict.exe"
h="C:WindowsSystem32en-USKernelBase.dll.mui"  a="chrome.exe"
h="C:WindowsSystem32en-USkernel32.dll.mui"  a="chrome.exe"
h="C:WindowsSystem32en-USKernelBase.dll.mui"  a="AppleChromeDAV.exe"    

==>
  

Ответ №3:

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

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

Шестнадцатеричный дамп выходных данных

В качестве обходного пути (как упоминал 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