2012-02-12 16 views

risposta

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% 

Ma non posso prendere credito per questo; Google ha trovato questo a http://www.dostips.com/forum/viewtopic.php?f=3&t=409

+1

Grazie ! Questo ha funzionato anche per me. Sto leggendo un elenco di cartelle da un file e formattandole. Ho usato questo: "per/F" token = 1 delim = "%% A in (list_of_files.txt) do (" –

+0

Potrebbe essere bello mostrare come ottenere solo il nome del file. (Senza l'estensione.) – Vaccano

+2

% ~ nI - espande% I in un nome file <- preso direttamente dall'output DOS per "help". –

0

Non so molto sui file batch, ma non potrei avere un file batch pre-copiato dalla directory home al percorso che hai che restituirebbe un elenco dei nomi dei file, quindi usalo nome?

Ecco un collegamento che ritengo possa essere utile per creare il file batch preimpostato.

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

Continuando dall'esempio di Pete sopra, per farlo direttamente nella finestra cmd, utilizzare un unico %, ad esempio:

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

(Si noti che i file speciali come desktop.ini non verranno visualizzati)

E 'anche possibile reindirizzare l'output in un file utilizzando >>:.

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

Per un vero e proprio esempio, supponendo che si desidera robocopy tutti file dalla cartella-A alla cartella-B (non in modo ricorsivo):

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

e per tutte le cartelle (ricorsivamente):

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

Durante l'utilizzo ho scoperto che se si utilizzano queste tecniche con robocopy è necessario anche ricordare di rimuovere l'ultima barra rovesciata nella directory di origine. Sarebbe utile se ci fosse un esempio che utilizza '% ~ dpX' come sorgente. – Annan

12

analizzare un nome di file dal nome percorso completo (ad esempio C: \ temp \ my.bat) a qualsiasi componente (ad esempio, file.ext).

singola linea di codice:

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

È possibile modificare out "C: \ Cartella1 \ Cartella2 \ file.ext" per qualsiasi percorso completo e il cambiamento "%% ~ fA" per una qualsiasi delle altre opzioni che troverai eseguendo "per /?" al prompt dei comandi.

Elaborato Codice

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) 

batch di script locale
Salva come C: \ cmd \ ParseFn.cmd.

Aggiungi C: \ cmd al variabile PATH ambiente e usarlo per memorizzare tutti voi script batch riutilizzabili.

@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. 
Problemi correlati