Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Отсортировать список процессов по ProcessID (http://forum.oszone.net/showthread.php?t=265930)

Dragokas 10-08-2013 22:12 2199632

Отсортировать список процессов по ProcessID
 
Подскажите, пожалуйста,
почему переменная !PID:~-4! не раскрывается, если мы собираем поток для передачи через канал к Sort?

Код:

@echo off
SetLocal EnableExtensions EnableDelayedExpansion

(
for /f "tokens=1,2 delims=," %%a in ('tasklist /nh /fo csv') do (
  @echo off
  set /A C+=1
  set PID=000%%~b
  echo !PID:~-4!        %%~a
)) | sort

pause


Foreigner 10-08-2013 22:51 2199649

Код:

@echo off
setlocal

(

    for /f "tokens=1,2 delims=," %%i in ('tasklist /nh /fo csv') do (

        set "pid=0000%%~j"
        call echo %%pid:~-4%% %%~i

    )

) | sort


Dragokas 11-08-2013 01:25 2199720

Foreigner, спасибо. Так работает.

Dragokas 11-08-2013 01:40 2199724

Забавно. Если написать во внутреннем цикле команду REM - вывода не будет.

amel27 11-08-2013 07:56 2199751

Цитата:

Цитата Diskretor
почему переменная !PID:~-4! не раскрывается, если мы собираем поток для передачи через канал к Sort? »

Потому что команда слева от "|" запускается в отдельном процессе CMD.EXE, в который предварительно копируются все пользовательские переменные окружения, а вот параметры сеанса (в том числе, отложенное расширение переменных, отображение команд и т.п.) сбрасываются в дефолтовые. Другим неприятным моментом такого поведения является то, что все изменения в переменных окружения дочернего CMD.EXE не будут отражены в родительском.

Цитата:

Цитата Diskretor
Если написать во внутреннем цикле команду REM - вывода не будет. »

альтернативные варианты: REM. , REM: или REM/

Dragokas 13-08-2013 23:39 2201082

Вложений: 1
Цитата:

Цитата amel27
все изменения в переменных окружения дочернего CMD.EXE не будут отражены в родительском. »

Да уж. Действительно, нежданчик =)

Код:

@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set before=10
(
  for /L %%C in (1,1,1) do (
    echo %before%
    set d=15
    set n=%%C& set after=%d%& set after=!d!
    echo !n!
    echo !after!
  )
) 1>&2 | set x=
echo ----------
echo %n%
echo %after%



Время: 13:56.

Время: 13:56.
© OSzone.net 2001-