Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Отсечение пути.Как?Или получение относительного пути. (http://forum.oszone.net/showthread.php?t=278125)

nfs911 21-02-2014 05:58 2312825

Отсечение пути.Как?Или получение относительного пути.
 
Всем привет!
Вот мы имеем такой простой код который выводит полные пути ко всему что есть в папке
Код:

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

nfs911,
Код:

... echo %%~nxA
Код:

for /?
call /?


nfs911 21-02-2014 08:39 2312852

Foreigner,
Цитата:

Цитата 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 2312876

Код:

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

Код:

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

Цитата:

Цитата nfs911
Напомню что мне нужно получить
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 2313340

Цитата:

Цитата 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

»

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

»


Цитата:

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


Iska 21-02-2014 21:04 2313351

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

Georgio 21-02-2014 21:45 2313371

Цитата:

Цитата Iska
Georgio, но всё равно, согласитесь — решение с subst'ом изящное:wink:. »

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

Цитата:

Цитата Georgio
Код:

set virt_disk=B:

subst %virt_disk% "%path_1%"|| exit /b

»


Цитата:

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

Цитата:

Цитата 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
)

»


Foreigner 21-02-2014 22:32 2313401

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

... do echo .%%~pnxi
Что и заявлено в названии топика

EVGA 08-05-2018 02:42 2812541

Цитата:

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

Эта команда начинает искать файлы по всему диску, а не в текущей папке.

Iska 08-05-2018 05:23 2812544

Цитата:

Цитата EVGA
Эта команда начинает искать файлы по всему диску, а не в текущей папке. »

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

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

megaloman 19-05-2018 11:29 2814458

nfs911, Эта задача полностью аналогична задаче, решенной alpap
Код:

@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



Время: 15:14.

Время: 15:14.
© OSzone.net 2001-