2012-02-12 41 views

Trả lời

60
@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% 

Nhưng tôi không thể lấy tín dụng cho điều này; Google tìm thấy này tại http://www.dostips.com/forum/viewtopic.php?f=3&t=409

+1

Cảm ơn ! Điều này cũng làm việc cho tôi. Tôi đang đọc trong danh sách các thư mục từ một tệp và định dạng chúng. Tôi đã sử dụng điều này: "for/F" tokens = 1 delims = "%% A in (list_of_files.txt) do (" –

+0

Có thể đẹp để chỉ cách lấy tên tệp. (Không có phần mở rộng.) – Vaccano

+2

% ~ nI - chỉ mở rộng% I thành một tên tập tin <- được lấy trực tiếp từ đầu ra DOS "for -help" –

0

Tôi không biết nhiều về tệp lô nhưng bạn không thể sao chép tệp hàng loạt được tạo trước từ thư mục chính sang đường dẫn bạn sẽ trả về danh sách tên tệp rồi sử dụng Tên?

Đây là liên kết tôi nghĩ có thể hữu ích khi tạo tệp hàng loạt được tạo sẵn.

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

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

Tiếp tục từ ví dụ của Pete trên, để làm điều đó trực tiếp trong cửa sổ cmd, sử dụng một đơn %, ví dụ:

cd c:\test\folder A
for %X in (*)do echo %~nxX

(Lưu ý rằng các file đặc biệt như desktop.ini sẽ không hiển thị)

Nó cũng có thể chuyển hướng đầu ra vào một tập tin sử dụng >>:.

cd c:\test\folder A
for %X in (*)do echo %~nxX>>c:\test\output.txt

Đối với một ví dụ thực tế, giả sử bạn muốn Robocopy tất cả file từ thư mục-A vào thư mục B (không đệ quy):

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

và cho tất cả thư mục (đệ quy):

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
+0

Trong khi sử dụng điều này tôi vừa phát hiện ra nếu bạn sử dụng các kỹ thuật này với robocopy, bạn cũng cần phải nhớ để loại bỏ dấu gạch chéo ngược cuối cùng trong thư mục mã nguồn sẽ hữu ích nếu có một ví dụ sử dụng '% ~ dpX' làm nguồn. – Annan

12

Phân tích cú pháp filename từ tên đường dẫn đầy đủ (ví dụ: c: \ temp \ my.bat) cho bất kỳ thành phần (ví dụ, file.ext).

dòng mã:

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

Bạn có thể thay đổi ra "C: \ folder1 \ folder2 \ file.ext" cho bất kỳ đường dẫn đầy đủ và thay đổi "%% ~ fA" cho bất kỳ tùy chọn nào khác bạn sẽ tìm thấy bằng cách chạy "for /?" tại dấu nhắc lệnh.

xây dựng Mã

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) 

hàng loạt độc Script
Save as C: \ cmd \ ParseFn.cmd.

Thêm C: \ cmd-PATH biến môi trường của bạn và sử dụng nó để lưu trữ tất cả các bạn các kịch bản hàng loạt tái sử dụng.

@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. 
Các vấn đề liên quan