Отсечение пути.Как?Или получение относительного пути.
Всем привет!
Вот мы имеем такой простой код который выводит полные пути ко всему что есть в папке
Код:
@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, переменная раскроется в имя файла и его расширение
А значит я получу вместо желаемого результата
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
|
Код:
@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
|
Код:
@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 »
|
Сорри, прочитал названия двух верхних файлов и понял вопрос не так.
Код:
@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
Код:
@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
|
|
Georgio, но всё равно, согласитесь — решение с subst'ом изящное ;). Первый слэш можно отсечением убирать.
|
Цитата:
Цитата 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
)
»
|
|
Georgio, Слеш можно и не убирать, добавь точку и будет относительный путь. Например:
Код:
... do echo .%%~pnxi
Что и заявлено в названии топика
|
Цитата:
Цитата nfs911
@echo off
FOR /F "tokens=*" %%A IN ('dir /s /b /a-d "%~n1\*.*"') DO echo "%%A"
pause »
|
Эта команда начинает искать файлы по всему диску, а не в текущей папке.
|
Цитата:
Цитата EVGA
Эта команда начинает искать файлы по всему диску, а не в текущей папке. »
|
Про текущую папку речь и не велась. Поиск осуществляется в каталоге, имя которого берётся от первого аргумента пакетного файла. И вот тут-то, если аргумент не указан, ясен пень, %~n1\*.* превращается в \*.*, поскольку в коде тупо не проверяется ни существование каталога, ни наличие аргумента при вызове пакетного файла.
EVGA, Вы что хотели-то?
|
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
|
Время: 06:37.
© OSzone.net 2001-