Можно ли в пакетном файле заменить использование SED и TR циклом for?

командный файл:

@echo.
@set curdrive=%~d0
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.

Пример вывода (один элемент пути в каждой строке):

C:\cheeso\bin
C:\Perl\bin
c:\utils
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
c:\Program Files\Microsoft SQL Server\90\Tools\binn\
c:\.net3.5
c:\.net2.0
c:\vs2008\common7\IDE
c:\netsdk2.0\bin

Этот пакетный файл зависит от sed.exe и tr.exe из UnxUtils. Я хотел бы сделать то же самое, используя только встроенные команды и программы, входящие в состав Windows. Могу ли я это сделать? Подсказки?


person Cheeso    schedule 15.09.2009    source источник


Ответы (4)


Предупреждение, злоупотребление рекурсией впереди:

@echo off

call :one "%PATH%"
goto :eof

:one
for /f "tokens=1,* delims=;" %%i in (%1) do (
    echo %%i
    if not "%%j"=="" call :one "%%j"
)
person Adam Mitz    schedule 15.09.2009
comment
У пользователя Джея есть отличная альтернатива: для работы в командном файле cmd"> stackoverflow.com/questions/817280/ - person Adam Mitz; 15.09.2009

Вот нерекурсивная версия. Не совсем лучше, но мне захотелось найти другое решение:

SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
:again
FOR /F "delims=;" %%I IN ("%PATH%") DO ECHO %%I & SET PATH=!PATH:%%I;=!
IF DEFINED PATH GOTO :again
ENDLOCAL

Я считаю, что это будет работать только для Windows XP, 2003 Server и новее.

person D.Shawley    schedule 15.09.2009
comment
Вы пытались запустить это? Он просто печатает первое значение в бесконечном цикле. Цикл for не пересчитывает выражение в скобках. - person Adam Mitz; 15.09.2009
comment
@ Адам - ​​да, он отлично работает в Windows 2003. Вы правы в том, что цикл FOR выводит первый элемент. Затем он удаляет элемент из PATH. IF DEFINED выполняется всякий раз, когда путь не пуст. Будьте осторожны при вводе оператора SET. - person D.Shawley; 15.09.2009
comment
Гораздо лучше, чем версия UnxUtils, и мне она нравится больше, чем рекурсивная версия. Но у меня это не сработало, пока я не добавил окончательное завершение ; к пути. - person Cheeso; 15.09.2009
comment
Я скопировал ваш сценарий точно в файл cmd и запустил его на своей машине (Vista). Это не сработало. Попробуйте пример, где %PATH% не заканчивается на ;. Раньше я ошибался, повторяется последний элемент, а не первый (так получилось в моей системе). - person Adam Mitz; 16.09.2009

Я попробовал это на моем сервере Windows 2003, и это сработало. Вот содержимое моего showpath.cmd:

@echo off
for %%p in (%PATH%) do echo %%p
person Hai Vu    schedule 15.09.2009
comment
Это не работает для моего пути, потому что мой путь включает имена каталогов, содержащие пробелы. Итак, C:\Program Files\Microsoft Team Foundation Server 2008 Power Tools\ отображается в 8 строках. - person Cheeso; 16.09.2009

Я начал использовать это:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set tpath=%path%;
echo.
:again
FOR /F "delims=;" %%I IN ("%TPATH%") DO (
  echo    %%I 
  set TPATH=!TPATH:%%I;=!
)
IF DEFINED TPATH GOTO :again

ENDLOCAL

Но потом решил, что это было проще:

setlocal
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo     %%~p
endlocal
person Cheeso    schedule 15.09.2009
comment
Кредит, где кредит должен. Более простым является пример Джея здесь: stackoverflow.com/questions/817280/ - person Adam Mitz; 16.09.2009