Batch Extrahieren Sie Pfad und Dateinamen aus einer Variablen


Antworten:


140
@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 ECHOzu 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.


1
@meir - wahr; Ich habe eine Korrektur veröffentlicht. Sie lernen in ein paar Jahren viel.
Magoo

@TrivisionZero: Nein, die Anführungszeichen sind erforderlich, wenn der Dateiname oder Pfad Leerzeichen enthält.
Magoo

@ceztko: Bitte erklären Sie genau, was die Aufnahme von /fbewirkt.
Magoo

/ F Beschränkt die Ausführung der Schleife gemäß Dokumentation auf nur ein Token . In meinen Tests war es notwendig, anscheinend weil der übergebene Pfad in Anführungszeichen eingeschlossen war. In Ihrem Beispiel ist es absolut sicher und es ist nur expliziter, dass die Schleife nur einmal ausgeführt wird.
Ceztko

Entschuldigung, ich habe die Änderung rückgängig gemacht, weil ich festgestellt habe, dass sie mit / F bei Leerzeichen im Pfad nicht mehr funktioniert. Trotzdem habe ich Probleme mit Ihrem Code in meinem Anwendungsfall (Shell-Erweiterungen). Ich werde nicht mehr bearbeiten und Ihnen das Update in meinem Fall vorschlagen, wenn ich es finden kann.
Ceztko

136

Sie können Pfad und Dateiname nur aus (1) einem Parameter der BVT selbst %1oder (2) dem Parameter eines CALL %1oder (3) einer lokalen FOR-Variablen extrahieren %%a.


in HELP CALLoder HELP FORSie 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%

Viel detailliertere Antwort. Vielen Dank.
Jorge Fuentes González

13

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

2

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


0

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 %~n1der Dateiname des ersten Arguments.

Ich hoffe das ist hilfreich für jemanden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.