في ملف دفعي، هل من الممكن أن يحل محل هذا الاستخدام للSED وTR مع لحلقة؟

StackOverflow https://stackoverflow.com/questions/1424558

  •  07-07-2019
  •  | 
  •  

سؤال

الملف الدفعي:

@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 فقط المضمنة. هل يمكن ان افعلها؟ تلميحات؟

هل كانت مفيدة؟

المحلول

setlocal
SET _Path="%Path:;=";"%"
FOR %%a IN (%_Path%) DO ECHO     %%~a
endlocal

نصائح أخرى

وتحذير وسوء المعاملة من قبل العودية:

@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"
)

وهنا نسخة غير متكررة. ليس حقا أفضل، ولكن شعرت وكأني أبحث عن حل آخر:

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 و الأحدث.

وحاولت هذه على بلدي خادم ويندوز 2003 وأنه يعمل. هنا هي محتويات بلدي showpath.cmd:

@echo off
for %%p in (%PATH%) do echo %%p

وبدأت في استخدام هذا:

@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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top