Как разбить имя файла из полного пути в пакетном сценарии?
Как разбить имя файла из полного пути в пакетном режиме?
Ответ 1
@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
Ответ 2
Разберите имя файла с полным именем пути (например, c:\temp\my.bat) на любой компонент (например, File.ext).
Одиночная строка кода:
For %%A in ("C:\Folder1\Folder2\File.ext") do (echo %%~fA)
Вы можете изменить "C:\Folder1\Folder2\File.ext" для любого полного пути и изменить "%% ~ fA" для любых других параметров, которые вы найдете, запустив "для/?". в командной строке.
Разработанный код
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)
Автономная партия Script
Сохранить как 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.
Ответ 3
@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 path is %folder%
Ответ 4
Я не так много знаю о пакетных файлах, но у вас нет готового пакетного файла, скопированного из домашнего каталога, в путь, который у вас есть, который вернет список имен файлов, затем используйте это имя?
Вот ссылка, я думаю, может быть полезной при создании готового пакетного файла.
Ответ 5
Следуя приведенному выше примеру Пита, чтобы сделать это непосредственно в окне cmd, используйте один %
, например:
cd c:\test\folder A
for %X in (*)do echo %~nxX
(Обратите внимание, что специальные файлы, такие как desktop.ini, не будут отображаться.)
Также можно перенаправить вывод в файл с помощью >>
:
cd c:\test\folder A
for %X in (*)do echo %~nxX>>c:\test\output.txt
В качестве реального примера, предполагая, что вы хотите robocopy все файлы из папки-A в папку-B (не рекурсивно):
cd c:\test\folder A for %X in (*)do robocopy . "c:\test\folder B" "%~nxX" /dcopy:dat /copyall /v>>c:\test\output.txt
и для всех папок (рекурсивно):
cd c:\test\folder A for /d %X in (*)do robocopy "%X" "C:\test\folder B\%X" /e /copyall /dcopy:dat /v>>c:\test\output2.txt