Как отделить имя файла от полного пути в пакете? - PullRequest
40 голосов
/ 13 февраля 2012

Как разделить имя файла по полному пути в пакетном сценарии?

Ответы [ 5 ]

68 голосов
/ 13 февраля 2012
@echo off
Set filename=C:\Documents and Settings\All Users\Desktop\Dostips.cmd
For %%A in ("%filename%") do (
    Set Folder=%%~dpA
    Set Name=%%~nxA
)
echo.Folder is: %Folder%
echo.Name is: %Name%

Но я не могу взять кредит на это; Google нашел это в http://www.dostips.com/forum/viewtopic.php?f=3&t=409

19 голосов
/ 26 мая 2016

Разбор имени файла с полным именем пути (например, c: \ temp \ my.bat) для любого компонента (например, File.ext).

Одна строка кода:

For %%A in ("C:\Folder1\Folder2\File.ext") do (echo %%~fA)

Вы можете заменить " C: \ Folder1 \ Folder2 \ File.ext " на любой полный путь и изменить "%% ~ fA"для любой другой опции, которую вы найдете, запустив" for /? "в командной строке.

Разработанный код

set "filename=C:\Folder1\Folder2\File.ext"
For %%A in ("%filename%") do (
    echo full path: %%~fA
    echo directory: %%~dA
    echo path: %%~pA
    echo file name only: %%~nA
    echo extension only: %%~xA
    echo expanded path with short names: %%~sA
    echo attributes: %%~aA
    echo date and time: %%~tA
    echo size: %%~zA
    echo drive + path: %%~dpA
    echo name.ext: %%~nxA
    echo full path + short name: %%~fsA)

Автономный пакетный скрипт
Сохранить как C: \ cmd \ParseFn.cmd .

Добавьте C: \ cmd в переменную окружения PATH и используйте ее для хранения всех многоразовых пакетных сценариев.

@echo off
@echo ::___________________________________________________________________::
@echo ::                                                                   ::
@echo ::                              ParseFn                              ::
@echo ::                                                                   ::
@echo ::                           Chris Advena                            ::
@echo ::___________________________________________________________________::
@echo.

::
:: Process arguements
::
if "%~1%"=="/?" goto help
if "%~1%"=="" goto help
if "%~2%"=="/?" goto help
if "%~2%"=="" (
    echo !!! Error: ParseFn requires two inputs. !!!
    goto help)

set in=%~1%
set out=%~2%
:: echo "%in:~3,1%"   "%in:~0,1%"
if "%in:~3,1%"=="" (
    if "%in:~0,1%"=="/" (
    set in=%~2%
    set out=%~1%)
)

::
:: Parse filename
::
set "ret="
For %%A in ("%in%") do (
    if "%out%"=="/f" (set ret=%%~fA)
    if "%out%"=="/d" (set ret=%%~dA)
    if "%out%"=="/p" (set ret=%%~pA)
    if "%out%"=="/n" (set ret=%%~nA)
    if "%out%"=="/x" (set ret=%%~xA)
    if "%out%"=="/s" (set ret=%%~sA)
    if "%out%"=="/a" (set ret=%%~aA)
    if "%out%"=="/t" (set ret=%%~tA)
    if "%out%"=="/z" (set ret=%%~zA)
    if "%out%"=="/dp" (set ret=%%~dpA)
    if "%out%"=="/nx" (set ret=%%~nxA)
    if "%out%"=="/fs" (set ret=%%~fsA)
)
echo ParseFn result: %ret%
echo.

goto end
:help
@echo off
:: @echo ::___________________________________________________________________::
:: @echo ::                                                                   ::
:: @echo ::                           ParseFn Help                            ::
:: @echo ::                                                                   ::
:: @echo ::                           Chris Advena                            ::
:: @echo ::___________________________________________________________________::
@echo.
@echo ParseFn parses a fully qualified path name (e.g., c:\temp\my.bat)
@echo into the requested component, such as drive, path, filename, 
@echo extenstion, etc.
@echo.
@echo Syntax: /switch filename
@echo where,
@echo   filename is a fully qualified path name including drive, 
@echo   folder(s), file name, and extension
@echo.
@echo   Select only one switch:
@echo       /f - fully qualified path name
@echo       /d - drive letter only
@echo       /p - path only
@echo       /n - file name only
@echo       /x - extension only
@echo       /s - expanded path contains short names only
@echo       /a - attributes of file
@echo       /t - date/time of file
@echo       /z - size of file
@echo      /dp - drive + path
@echo      /nx - file name + extension
@echo      /fs - full path + short name
@echo.

:end
:: @echo ::___________________________________________________________________::
:: @echo ::                                                                   ::
:: @echo ::                         ParseFn finished                          ::
:: @echo ::___________________________________________________________________::
:: @echo.
6 голосов
/ 21 августа 2015
@echo off
Set filename="C:\Documents and Settings\All Users\Desktop\Dostips.cmd"
call :expand %filename%
:expand
set filename=%~nx1
echo The name of the file is %filename%
set folder=%~dp1
echo It's path is %folder%
0 голосов
/ 04 мая 2016

Продолжая из приведенного выше примера Пита, чтобы сделать это непосредственно в окне cmd, используйте один %, например:

cd c:\test\folder A<br>for %<b>X</b> in (*)do echo %~nx<b>X</b>

(обратите внимание, что специальные файлы, такие как desktop.ini, не будут отображаться.)

Также возможно перенаправить вывод в файл, используя >>:

cd c:\test\folder A<br>for %<b>X</b> in (*)do echo %~nx<b>X</b>>>c:\test\output.txt

В качестве реального примера, предположим, что вы хотите роботизировать все файлы из папки A в папку B (не рекурсивно):

cd c:\test\folder A
for %<b>X</b> in (*)do robocopy . "c:\test\folder B" "%~nx<b>X</b>" /dcopy:dat /copyall /v>>c:\test\output.txt

и для всех папок (рекурсивно):

cd c:\test\folder A
for /d %<b>X</b> in (*)do robocopy "%X" "C:\test\folder B\%X" /e /copyall /dcopy:dat /v>>c:\test\output2.txt
0 голосов
/ 13 февраля 2012

Я не так много знаю о пакетных файлах, но разве вы не могли скопировать предварительно созданный пакетный файл из домашнего каталога по указанному вами пути, который бы возвратил список имен файлов, а затем использовал бы это имя??

Вот ссылка, которая, я думаю, может быть полезна для создания готового пакетного файла.

http://www.ericphelps.com/batch/lists/filelist.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...