Можно ли в этом пакетном файле заменить использование SED и TR на цикл for? - PullRequest
0 голосов
/ 15 сентября 2009

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

@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. Могу ли я это сделать? Советы?

Ответы [ 5 ]

1 голос
/ 16 сентября 2009
setlocal
SET _Path="%Path:;=";"%"
FOR %%a IN (%_Path%) DO ECHO     %%~a
endlocal
1 голос
/ 15 сентября 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 и новее.

1 голос
/ 15 сентября 2009

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

@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"
)
0 голосов
/ 15 сентября 2009

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

@echo off
for %%p in (%PATH%) do echo %%p
0 голосов
/ 15 сентября 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...