CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Аватара пользователя
nfs911

CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение nfs911 »

Всем привет!

Вот мы имеем такой простой код который выводит полные пути ко всему что есть в папке



Код:

Код: Выделить всё

@echo off
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%~n1\*.*"') DO echo "%%A"
pause

или



Код:

Код: Выделить всё

@echo off
set path_1=D:\test\a
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%path_1%\*.*"') DO echo "%%A"
pause

Получаем результат

D:\test\a\test.exe

D:\test\a\abc.txt

D:\test\a\fold1\qwer.bat

D:\test\a\fold1\dir\start.7z

D:\test\a\test_dir\dell.dll



Но мне на выходе нужно получить

test.exe

abc.txt

fold1\qwer.bat

fold1\dir\start.7z

test_dir\dell.dll



как это реализовать?
Аватара пользователя
EVGA

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение EVGA »

Foreigner,
Цитата Foreigner:



%%~nxA
CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.




переменная раскроется в имя файла и его расширение



А значит я получу вместо желаемого результата

test.exe

abc.txt

qwer.bat

start.7z

dell.dll



Напомню что мне нужно получить



test.exe

abc.txt

fold1\qwer.bat

fold1\dir\start.7z

test_dir\dell.dll
Аватара пользователя
nfs911

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение nfs911 »

Код:

Код: Выделить всё

@echo off
setlocal enableextensions enabledelayedexpansion
set sRootFolder=C:\Temp
if exist "%sRootFolder%\." (
	for /f "usebackq delims=" %%i in (
		`dir /b /s /a:-d "%sRootFolder%\*.*"`
	) do (
		set sVar=%%~i
		set sPath=!sVar:%sRootFolder%\=!
		echo [!sPath!]
	)
) else (
	echo Folder [%sRootFolder%] not found.
	exit /b 1
)
endlocal
exit /b 0
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Iska »

Код:

Код: Выделить всё

@echo off
setlocal enableextensions enabledelayedexpansion
set sRootFolder=C:\Temp
if exist "%sRootFolder%\." (
	for /f "usebackq delims=" %%i in (
		`dir /b /s /a:-d "%sRootFolder%\*.*"`
	) do (
		set sVar=%%~i
		set sPath=!sVar:%sRootFolder%\=!
		echo [!sPath!]
	)
) else (
	echo Folder [%sRootFolder%] not found.
	exit /b 1
)
endlocal
exit /b 0
Аватара пользователя
Georgio

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Georgio »

Цитата nfs911:



Напомню что мне нужно получить

test.exe

abc.txt

fold1\qwer.bat

fold1\dir\start.7z

test_dir\dell.dll
CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.




Сорри, прочитал названия двух верхних файлов и понял вопрос не так.



Код:

Код: Выделить всё

@echo off
setlocal
subst s: "d:\test\a"
pushd s:\
for /f "tokens=*" %%i in ('dir /b /s /a-d ') do echo %%~pnxi
popd
subst s: /d
Аватара пользователя
Foreigner

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Foreigner »

Цитата Foreigner:





Код:

Код: Выделить всё

@echo off
setlocal
subst s: "d:\test\a"
pushd s:\
for /f "tokens=*" %%i in ('dir /b /s /a-d ') do echo %%~pnxi
popd
subst s: /d

CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.




Foreigner, в Вашем выводе в начале каждой строки присутствует обратный слеш:





Код:

Код: Выделить всё

\abc.txt
\test.exe
\fold1\qwer.bat
\fold1\dir\start.7z
\test_dir\dell.dll



В этом же решении обратного слеша в начале каждой строки нет:




Цитата Georgio:





Код:

Код: Выделить всё

@echo off
set path_1=D:\test\a
set virt_disk=B:
subst %virt_disk% "%path_1%"|| exit /b
for /f "usebackq tokens=* delims=\" %%B in (`
 for /f ^"tokens^=*^" %%A in ^('dir /s /b /a-d %virt_disk%\'^) do @echo %%~pnxA
`) do (
echo %%B
)
subst %virt_disk% /d
pause>nul
exit /b

CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.







Цитата nfs911:



Напомню что мне нужно получить

test.exe

abc.txt

fold1\qwer.bat

fold1\dir\start.7z

test_dir\dell.dll
Аватара пользователя
Georgio

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Georgio »

Georgio, но всё равно, согласитесь — решение с subst'ом изящное Изображение. Первый слэш можно отсечением убирать.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Iska »

Цитата Iska:



Georgio, но всё равно, согласитесь — решение с subst'ом изящноеИзображение.
CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.




Конечно, согласен. Приоритет ведь за мной:




Цитата Georgio:





Код:

Код: Выделить всё

set virt_disk=B:
subst %virt_disk% "%path_1%"|| exit /b

CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.







Цитата:



Первый слэш можно отсечением убирать.



Что и было сделано:




Цитата Georgio:





Код:

Код: Выделить всё

for /f "usebackq tokens=* delims=\" %%B in (`
 for /f ^"tokens^=*^" %%A in ^('dir /s /b /a-d %virt_disk%\'^) do @echo %%~pnxA
`) do (
echo %%B
)

CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути.

Сообщение Iska »

Georgio, Слеш можно и не убирать, добавь точку и будет относительный путь. Например:



Код:

Код: Выделить всё

... do echo .%%~pnxi

Что и заявлено в названии топика
Ответить

Вернуться в «Скриптовые языки администрирования Windows»