Wie kann ich Pfad und Dateinamen aus einer Variablen extrahieren?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
Ich möchte das tun, ohne eine Funktion oder ein GOTO zu verwenden. ist es möglich?
Wie kann ich Pfad und Dateinamen aus einer Variablen extrahieren?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
Ich möchte das tun, ohne eine Funktion oder ein GOTO zu verwenden. ist es möglich?
Antworten:
@ECHO OFF
SETLOCAL
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
Ich bin mir nicht sicher, was du mit keiner "Funktion" meinst.
Wechseln Sie natürlich ECHO
zu SET
, um die Variablen festzulegen, anstatt sie zu ECHOEN ...
Eine vollständige Liste finden Sie in der for
Dokumentation .
Ceztkos Testfall (als Referenz)
@ECHO OFF
SETLOCAL
set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
FOR /F "delims=" %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
Kommentar: siehe Kommentare.
/f
bewirkt.
Sie können Pfad und Dateiname nur aus (1) einem Parameter der BVT selbst %1
oder (2) dem Parameter eines CALL %1
oder (3) einer lokalen FOR-Variablen extrahieren %%a
.
in HELP CALL
oder HELP FOR
Sie können detailliertere Informationen finden:
% ~ 1 - erweitert% 1 um alle umgebenden Anführungszeichen (")
% ~ f1 - erweitert% 1 zu einem vollständig qualifizierten Pfadnamen
% ~ d1 - erweitert% 1 nur zu einem Laufwerksbuchstaben
% ~ p1 - erweitert% 1 nur zu einem Pfad
% ~ n1 - erweitert% 1 nur auf einen Dateinamen
% ~ x1 - erweitert% 1 nur auf eine Dateierweiterung
% ~ s1 - erweiterter Pfad enthält nur Kurznamen
% ~ a1 - erweitert% 1 auf Dateiattribute
% ~ t1 - erweitert% 1 bis Datum / Uhrzeit der Datei
% ~ z1 - erweitert% 1 auf die Größe der Datei
Und dann versuchen Sie Folgendes:
Übergeben Sie entweder die zu analysierende Zeichenfolge als Parameter an einen CALL
call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof
:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof
oder das Äquivalent, übergeben Sie den Dateinamen als lokale FOR-Variable
for %%a in (..\Desktop\fs.cfg) do (
set file=%%~fa
set filepath=%%~dpa
set filename=%%~nxa
)
echo %file% = %filepath% + %filename%
All dies funktioniert für mich:
@Echo Off
Echo Directory = %~dp0
Echo Object Name With Quotations=%0
Echo Object Name Without Quotes=%~0
Echo Bat File Drive = %~d0
Echo Full File Name = %~n0%~x0
Echo File Name Without Extension = %~n0
Echo File Extension = %~x0
Pause>Nul
Ausgabe:
Directory = D:\Users\Thejordster135\Desktop\Code\BAT\
Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"
Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat
Bat File Drive = D:
Full File Name = Path.bat
File Name Without Extension = Path
File Extension = .bat
Wenn Sie Informationen aus der aktuell ausgeführten Batchdatei wünschen, versuchen Sie Folgendes:
@echo off
set myNameFull=%0
echo myNameFull %myNameFull%
set myNameShort=%~n0
echo myNameShort %myNameShort%
set myNameLong=%~nx0
echo myNameLong %myNameLong%
set myPath=%~dp0
echo myPath %myPath%
set myLogfileWpath=%myPath%%myNameShort%.log
echo myLogfileWpath %myLogfileWpath%
mehr Proben? C:> HILFE ANRUFEN
% 0 = Parameter 0 = Batchdatei% 1 = Parameter 1 - 1. Par. an Batchdatei übergeben ... damit Sie das Zeug (zB "~ dp") zwischen dem ersten (zB "%") und dem letzten (zB "1") auch für Parameter ausprobieren können
Späte Antwort, ich weiß, aber für mich ist das folgende Skript sehr nützlich - und es beantwortet auch die Frage, indem es zwei Fliegen mit einer Flagge trifft ;-)
Das folgende Skript erweitert SendTo im Kontextmenü des Datei-Explorers:
@echo off
cls
if "%~dp1"=="" goto Install
REM change drive, then cd to path given and run shell there
%~d1
cd "%~dp1"
cmd /k
goto End
:Install
rem No arguments: Copies itself into SendTo folder
copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"
:End
Wenn Sie dieses Skript ohne Parameter ausführen, indem Sie darauf doppelklicken, kopiert es sich selbst in den Ordner SendTo und benennt es in "A - In CMD shell.cmd öffnen" um. Danach steht es im Kontextmenü "SentTo" zur Verfügung.
Klicken Sie dann mit der rechten Maustaste auf eine Datei oder einen Ordner im Windows Explorer und wählen Sie "SendTo> A - In CMD shell.cmd öffnen".
Das Skript ändert Laufwerk und Pfad in den Pfad, der die ausgewählte Datei oder den ausgewählten Ordner enthält, und öffnet eine Befehlsshell mit diesem Pfad - nützlich für Visual Studio-Code, da Sie dann einfach "Code" eingeben können. um es im Kontext Ihres Projekts auszuführen.
Wie funktioniert es?
%0
- vollständiger Pfad des Batch-Skripts
%~d1
- das im ersten Argument enthaltene Laufwerk (z. B. "C:")
%~dp1
- der im ersten Argument enthaltene Pfad
cmd /k
- öffnet eine Befehlsshell, die offen bleibt
Wird hier nicht verwendet, ist aber %~n1
der Dateiname des ersten Arguments.
Ich hoffe das ist hilfreich für jemanden.