Cara mendapatkan path folder dari path file dengan CMD

151

Saya perlu path ke folder yang berisi file cmd. Dengan% 0 saya bisa mendapatkan nama file. Tapi bagaimana cara mendapatkan nama folder?

c: \ temp \ test.cmd >> test.cmd

PS Direktori saya saat ini! = Folder skrip.

Mike Chaliy
sumber

Jawaban:

310

Untuk nama folder dan drive, Anda dapat menggunakan:

echo %~dp0

Anda bisa mendapatkan lebih banyak informasi menggunakan pengubah berbeda:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file

The modifiers can be combined to get compound results:
%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

Ini adalah salinan dari "untuk /?" perintah pada prompt. Semoga ini bisa membantu.

Terkait

10 tips DOS Batch (Ya, DOS Batch ...) menunjukkan batchparams.bat (tautan ke sumber sebagai intisari):

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE
Wadih M.
sumber
Keren. Apakah saya memerlukan skor tertentu untuk mengubah posting wiki orang lain?
Wadih M.
@Wadih M .: Tautan yang secara umum bermanfaat stackoverflow.com/questions/18557/…
jfs
@Wadih M .: Khususnya stackoverflow.com/questions/130654/…
jfs
@Wadih M .: Dari tautan di atas: "+750 untuk mengedit posting 'wiki yang dapat diedit komunitas"
jfs
Jadi jika Anda ingin skrip cmd untuk mengatur direktori kerja ke lokasi skrip: cd /d "%~dp0"(dari stackoverflow.com/questions/4451668 )
Nigel Touch
52

Jawaban yang diterima sangat membantu, tetapi tidak segera jelas bagaimana cara mengambil nama file dari jalur jika Anda TIDAK menggunakan nilai yang diteruskan. Saya bisa menyelesaikan ini dari utas ini, tetapi jika yang lain tidak seberuntung ini, inilah caranya

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

Sekarang :file_name_from_pathfungsi dapat digunakan di mana saja untuk mengambil nilai, tidak hanya untuk argumen yang diteruskan. Ini bisa sangat membantu jika argumen dapat diteruskan ke file dalam urutan yang tidak ditentukan atau jalur tidak diteruskan ke file sama sekali.

NightOwl888
sumber
wow, itu luar biasa! Jadi file batch Windows mendukung fungsi di dalam file yang sama, betapa bermanfaatnya Sejak kapan ini mungkin?
Luke
2
Saya suka bahwa Anda dapat melewati variabel baik dengan referensi (seperti) dan dengan nilai (dikelilingi dengan "!" Ok, Anda mungkin tidak memiliki variabel "lokal" dan tumpukan panggilan ... tapi hei: lagipula itu skrip cmd, ini adalah langkah besar ke depan;) Saya setuju, mempartisi barang di dalam satu file jauh lebih berguna. daripada membaginya di beberapa file :)
Luke
1
Saya pikir "goto: eof" harus "goto eof" .. tanpa tanda titik dua .. karena itu melanggar bagi saya.
A Khudairy
2
Lihat juga: ss64.com/nt/syntax-args.html - gunakan hanya %~dp1untuk drive dan path.
Andrew
2
@AKhudairy benar: ss64.com/nt/goto.html Dengan titik dua goto melewatkan endlocal (dan apa pun yang Anda masukkan sesudahnya, seperti jeda). Anda juga perlu menambahkan "sekitar !myPath!jika jalur Anda memiliki ruang di dalamnya (atau memiliki tanda kutip menjadi bagian dari myPath)
Rick
8

Untuk menetapkan ini ke variabel, pastikan untuk tidak menambahkan spasi di depan atau setelah tanda sama dengan:

set filepath=%~dp1
set filename=%~nx1

Maka Anda seharusnya tidak memiliki masalah.

jujur
sumber
5

Jika ada yang menginginkan metode alternatif ...

Jika ini adalah subdirektori terakhir di jalur, Anda bisa menggunakan satu-baris ini:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

Ini akan mengembalikan yang berikut:

c:\directory\subdirectory

.... turun kembali ke direktori sebelumnya. / iklan hanya menampilkan direktori / b adalah format daftar kosong / s termasuk semua subdirektori. Ini digunakan untuk mendapatkan path lengkap dari direktori untuk dicetak.

Menandai
sumber
Mungkin berfungsi melawan direktori saat ini, bukan direktori tempat file skrip berada.
Mike Chaliy
4

Saya memiliki masalah yang sama di loop saya di mana saya ingin mengekstrak file zip di direktori yang sama dan kemudian menghapus file zip. Masalahnya adalah bahwa 7z memerlukan folder output, jadi saya harus mendapatkan path folder dari setiap file. Ini solusinya:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% i adalah path nama file lengkap dan% ii \ .. cukup mengembalikan folder induk.

semoga membantu.

Gico
sumber
Cepat dan kotor. Aku suka itu! Tidak pernah terpikir Anda akan memperpanjang jalur file dengan "\ .." dan berakhir dengan folder induk.
Oliver R.
Ini bekerja untuk saya di Win10: UNTUK / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii
Iya! Ini mengatasi masalah yang% ~ dp1 (dll.) Hanya bekerja pada% 0,% 1,% 2 dll.
Artelius
3

Jika jawaban yang diterima oleh Wadih tidak berhasil untuk Anda, cobalah echo %CD%

Naguib Ihab
sumber
0

Ini disatukan dengan beberapa contoh cmd yang diedit

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

:end
PAUSE
Steve Seymour
sumber