#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
обратите внимание на последнюю строку…
Комментарии:
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