CMD ile dosya yolundan klasör yolu nasıl alınır


151

Cmd dosyası içeren klasörün yolunu ihtiyacım var. % 0 ile dosya adını alabilirim. Ancak klasör adı nasıl alınır?

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

PS Geçerli dizinim! = Komut dosyasının klasörü.

Yanıtlar:


310

Klasör adı ve sürücüsü için şunları kullanabilirsiniz:

echo %~dp0

Farklı değiştiriciler kullanarak daha fazla bilgi edinebilirsiniz:

%~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

Bu, "for /?" komut isteminde. Umarım yardımcı olur.

İlişkili

En iyi 10 DOS Toplu İş ipucu (Evet, DOS Toplu İş ...) batchparams.bat ( öz kaynak olarak kaynağa bağlantı ) gösterir :

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

Güzel. Başkasının wiki yayınını değiştirmek için belirli bir puana ihtiyacım var mı?
Wadih M.Mar

@Wadih M .: Genel olarak yararlı link stackoverflow.com/questions/18557/…
jfs


@Wadih M .: Yukarıdaki bağlantıdan: "+750 topluluğu düzenlemek için 'wiki düzenlenebilir' gönderileri"
jfs

Bir cmd betiğinin çalışma dizinini betiğin konumuna ayarlamasını istiyorsanız: cd /d "%~dp0"( stackoverflow.com/questions/4451668
Nigel Touch

52

Kabul edilen cevap yararlıdır, ancak iletilen değerleri KULLANMADIĞINIZda yoldan dosya adını nasıl alacağınız hemen belli olmaz. Ben bu iş parçacığı üzerinden bunu başardı, ama diğerleri çok şanslı değilse, işte nasıl yapılır:

@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

Şimdi :file_name_from_pathfonksiyon sadece argümanlarda değil, değeri almak için her yerde kullanılabilir. Bu, argümanlar dosyaya belirsiz bir sırada iletilebiliyorsa veya yol dosyaya hiç aktarılmamışsa son derece yararlı olabilir.


vay canına bu inanılmaz! Yani windows toplu iş dosyaları aynı dosya içindeki işlevi desteklemek, ne kadar yararlı! Ne zamandan beri bu mümkün oldu?
Luke

2
Değişkenleri hem referans (olduğu gibi) hem de değere ("!" S ile çevrili) geçirebilmeyi seviyorum. Tamam, muhtemelen "yerel" değişkenler ve bir çağrı yığını yok ... ama hey: sonuçta bir cmd betiği, zaten büyük bir adım; birkaç dosya etrafında bölme daha :)
Luke

1
Sanırım "goto: eof", "goto eof" olmalı ... iki nokta üst üste olmadan .. benim için kırıldığı için.
Khudairy

2
Ayrıca bkz: ss64.com/nt/syntax-args.html - %~dp1yalnızca sürücü ve yol için kullanın.
Andrew

2
@AKhudairy doğrudur: ss64.com/nt/goto.html İki nokta üst üste işaretiyle birlikte goto endlokal (ve daha sonra bir duraklama gibi koyduğunuz) atlar. Ayrıca , yolunuzda boşluklar varsa (veya tırnak işaretleri myPath'in bir parçasıysa) "etrafına s eklemeniz gerekir!myPath!
Rick

8

Bunları değişkenlere atamak için önüne veya eşittir işaretinden sonra boşluk eklemediğinizden emin olun:

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

O zaman sorun yaşamamalısın.


5

Herhangi birinin alternatif bir yöntem istemesi durumunda ...

Yoldaki son alt dizinse, bu tek astarı kullanabilirsiniz:

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

Bu, aşağıdakileri döndürür:

c:\directory\subdirectory

.... bir önceki dizine geri döner. / ad yalnızca dizinleri gösterir / b, çıplak bir biçim listesidir / s, tüm alt dizinleri içerir. Bu, yazdırılacak dizinin tam yolunu almak için kullanılır.


Büyük olasılıkla komut dosyasının bulunduğu dizinde değil, geçerli dizinde çalışır.
Mike Chaliy

4

Ben aynı dizinde zip dosyaları ayıklamak ve sonra zip dosyasını silmek istediğim benim döngüde aynı sorun vardı. Sorun 7z çıktı klasörü gerektirir, bu yüzden her dosyanın klasör yolunu elde etmek zorunda kaldı. İşte benim çözümüm:

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

%% i bir tam dosya adı yoluydu ve% ii \ .. yalnızca üst klasörü döndürüyor.

Umarım yardımcı olur.


Hızlı ve kirli. Bunu sevdim! Asla "\ .." ile bir dosya yolunu uzattığınızı ve üst klasörle sonuçlanacağınızı düşünmedim.
Oliver

Bu benim için Win10 üzerinde çalıştı: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii

Evet! Bu,% ~ dp1 (vb.) Öğesinin yalnızca% 0,% 1,% 2 vb.
Üzerinde çalıştığı sorunu çözer

3

Wadih'in kabul ettiği cevabın sizin için işe yaramaması durumunda, echo %CD%


0

Bu bazı düzenlenmiş cmd örnekleri ile bir araya getirildi

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.