PDA

Показать полную графическую версию : результат команды в переменную


BreakHeart
17-09-2015, 15:40
Здравствуйте!Подскажите, пожалуйста, как можно занести результат выполнения команды в переменную?
Делаю следующим образом:

setlocal enabledelayedexpansion
FOR /F "usebackq delims=" %%a IN (`handle.exe -accepteula`) DO (
set result=%%a
)
echo %result%

Но в итоге в result только последняя строка вывода(
Подскажите, пожалуйста, что нужно подправить?

Iska
17-09-2015, 17:34
Никак. Не надо «заносить результат выполнения команды в переменную», надо сразу производить потребные действия над каждой строкой вывода — там, где у Вас находится «set result=%%a».

alpap
20-09-2015, 21:36
А почему так нельзя:
@echo on
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%a in (`handle.exe -accepteula`) do (
set result=%%a
echo !result!
)
pause.

Iska
20-09-2015, 23:36
А почему так нельзя: »
Потому что неизвестно, что на самом деле автору нужно вместо прозаичного «занести результат выполнения команды в переменную».

Foreigner
21-09-2015, 00:04
alpap, В переменную заносится только одна строка, сначала первая, потом вторая ... потом последняя. Поэтому нужно либо обрабатывать вывод сразу в цикле, либо отфильтровывать нужную строку, либо заносить в разные переменные. Покажите вывод:

handle.exe -accepteula

И опишите, что конкретно вам нужно взять в переменную

alpap
21-09-2015, 00:26
Foreigner, да Вы перепутали это не мне и я то знаю, тоже хотел помочь чем-то BreakHeart, может ему просто вывод достаточно увидеть и ничего обрабатывать он и не собирается, разные задачи бывают.

Foreigner
21-09-2015, 00:50
alpap, Извиняюсь, невнимательно посмотрел. Но и в вашем примере можно просто сделать echo %%a, т.е. переменная result явно лишняя. Если надо сохранить весь вывод можно создать массив переменных, например:

@echo off
setlocal enabledelayedexpansion

set cnt=100
for /f "tokens=*" %%i in ('dir /b') do call:set "%%i"
for /f "tokens=2 delims==" %%i in ('set var_') do echo %%i

echo.
echo %var_101% первый элемент
echo %var_102% второй
echo !var_%cnt%! последний
goto:eof

:set
set /a cnt+=1
set "var_%cnt%=%~1"


Но без реального вывода handle.exe, это лишь пример... Могут быть нюансы

BreakHeart
21-09-2015, 10:10
handle.exe - это программа из набора sysinternals, которая выводит список процессов и к каждому процессу хендл, который он держит. проблема в том что сначала идет строка с именем процесса, а потом список хенделов открытых процессов. мне нужно посмотреть есть ли нужный хендл и если есть, то вывесть имя процесса. есть вариант сначала записать в файл, потом пройтись find по файлу, но сразу возникает вопрос как определить нашел ли find нужную строку или нет?

Iska
21-09-2015, 10:57
мне нужно посмотреть есть ли нужный хендл »
Ну, так и смотрите именно его, указав полный путь, например:
C:\Out>handle /accepteula "C:\Out\Untitled.FR10.pdf"

Handle v3.46
Copyright (C) 1997-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

AcroRd32.exe pid: 4564 type: File 1C0: C:\Out\Untitled.FR10.pdf

Примерная болванка:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourcePath=C:\Out\Untitled.FR10.pdf
set sProcessName=

for /f "usebackq" %%i in (
`handle.exe /accepteula "%sSourcePath%" ^| find.exe /i "%sSourcePath%"`
) do (
set sProcessName=%%i
)

if defined sProcessName (
echo [%sProcessName%]
) else (
echo Nothing found
)

endlocal
exit /b 0

Foreigner
21-09-2015, 11:20
BreakHeart, Может лучше сразу искать по нужному хэндлу? Например, запустил mp3 в консольном noisy.exe (такой проигрыватель):

noisy "D:\test\05 - Smoke on the Water.mp3"
Ищу кто держит файл:

> handle "05 - Smoke" | findstr "pid"
Noisy.exe pid: 5492 type: File 310: D:\test\05 - Smoke on the Water.mp3
Из полученной строки можно взять pid процесса и дескриптор файла, чтобы его отцепить:

handle -p 5492 -c 310 -y


ЗЫ. Для закрытия необходима админская консоль

BreakHeart
21-09-2015, 13:17
Iska, благодарю, твой совет практически то. что надо

PATRI0T
25-06-2019, 19:39
Простите за глупый вопрос..
Хочу, чтобы cpu-z мог создать отчет в html файле с именем этого компьютера, и надо ему в аргумент передать результат выполнения команды whoami

Подскажите, как? Если бы это был bash, я бы сделал так
cpu-z -html=`whoami`

Iska
25-06-2019, 22:08
PATRI0T,
echo %ComputerName%

PATRI0T
26-06-2019, 00:15
оуч.. точно ))
Спасибо огромное. Что-то я не подумал в эту сторону )




© OSzone.net 2001-2012