Войти

Показать полную графическую версию : [решено] Отсечение пути.Как?Или получение относительного пути.


nfs911
21-02-2014, 05:58
Всем привет!
Вот мы имеем такой простой код который выводит полные пути ко всему что есть в папке
@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

как это реализовать?

Foreigner
21-02-2014, 07:24
nfs911,

... echo %%~nxA


for /?
call /?

nfs911
21-02-2014, 08:39
Foreigner, %%~nxA »
переменная раскроется в имя файла и его расширение

А значит я получу вместо желаемого результата
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

Iska
21-02-2014, 09:48
@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
21-02-2014, 14:48
@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

Foreigner
21-02-2014, 19:14
Напомню что мне нужно получить
test.exe
abc.txt
fold1\qwer.bat
fold1\dir\start.7z
test_dir\dell.dll »

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

@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

Georgio
21-02-2014, 20:47
@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, в Вашем выводе в начале каждой строки присутствует обратный слеш:

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


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

@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 »


Напомню что мне нужно получить
test.exe
abc.txt
fold1\qwer.bat
fold1\dir\start.7z
test_dir\dell.dll

Iska
21-02-2014, 21:04
Georgio, но всё равно, согласитесь — решение с subst'ом изящное ;). Первый слэш можно отсечением убирать.

Georgio
21-02-2014, 21:45
Georgio, но всё равно, согласитесь — решение с subst'ом изящное:wink:. »

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

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
) »

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

... do echo .%%~pnxi

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

EVGA
08-05-2018, 02:42
@echo off
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%~n1\*.*"') DO echo "%%A"
pause »Эта команда начинает искать файлы по всему диску, а не в текущей папке.

Iska
08-05-2018, 05:23
Эта команда начинает искать файлы по всему диску, а не в текущей папке. »
Про текущую папку речь и не велась. Поиск осуществляется в каталоге, имя которого берётся от первого аргумента пакетного файла. И вот тут-то, если аргумент не указан, ясен пень, %~n1\*.* превращается в \*.*, поскольку в коде тупо не проверяется ни существование каталога, ни наличие аргумента при вызове пакетного файла.

EVGA, Вы что хотели-то?

megaloman
19-05-2018, 11:29
nfs911, Эта задача полностью аналогична задаче, решенной alpap (http://forum.oszone.net/thread-334540.html)@Echo Off
Cls
Set "D1=D:\CMD_Forum"
Set "Pref=%D1%\"
For /f "Delims=" %%a in ('2^>nul Dir /a-d /b /s "%D1%"') Do Set "nf=*%%a" &Call :Out "%%nf:*%Pref%=%%"
pause
GoTo :Eof
:Out
Echo %1
exit /b




© OSzone.net 2001-2012