Em um arquivo de lote, é possível substituir esse uso do SED e TR com um loop for?
-
07-07-2019 - |
Pergunta
o arquivo de lote:
@echo.
@set curdrive=%~d0
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.
Exemplo de saída (um elemento caminho em cada linha):
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
Este arquivo de lote depende da sed.exe eo tr.exe de UnxUtils . Eu gostaria de fazer a mesma coisa usando apenas built-in comandos e programas que estão incluídos no Windows. Posso fazer isso? Sugestões?
Solução
setlocal
SET _Path="%Path:;=";"%"
FOR %%a IN (%_Path%) DO ECHO %%~a
endlocal
Outras dicas
Atenção, abuso de recursão frente:
@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"
)
Aqui está uma versão não-recursiva. Não é realmente melhor, mas eu senti como procurar uma outra solução:
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
:again
FOR /F "delims=;" %%I IN ("%PATH%") DO ECHO %%I & SET PATH=!PATH:%%I;=!
IF DEFINED PATH GOTO :again
ENDLOCAL
Eu acredito que isso só funcionará para o Windows XP, 2003 Server, e mais recente.
Eu tentei isso no meu servidor Windows 2003 e funcionou. Aqui está o conteúdo do meu showpath.cmd:
@echo off
for %%p in (%PATH%) do echo %%p
Eu comecei a usar este:
@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
Mas, então, decidiu este era mais simples:
setlocal
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo %%~p
endlocal
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow