Czy istnieje sposób w skrypcie wsadowym systemu Windows, aby zwrócić ścieżkę bezwzględną z wartości zawierającej nazwę pliku i / lub ścieżkę względną?
Dany:
"..\"
"..\somefile.txt"
Potrzebuję bezwzględnej ścieżki względem pliku wsadowego.
Przykład:
- Plik „somefile.txt” znajduje się w „C: \ Foo \”
- „test.bat” znajduje się w „C: \ Foo \ Bar”.
- Użytkownik otwiera okno poleceń w „C: \ Foo” i wywołuje
Bar\test.bat ..\somefile.txt
- W pliku wsadowym będzie pochodzić „C: \ Foo \ somefile.txt”
%1
windows
batch-file
relative-path
absolute-path
Nathan Taylor
źródło
źródło
realpath
do solidnej normalizacji ścieżki.SET FilePath=%CD%\%1
tak, aby mogła wyglądać jakC:\Foo\Bar\..\..\some\other\dir\file.txt
. Programy wydają się rozumieć tak skomplikowaną ścieżkę.Odpowiedzi:
W plikach wsadowych, podobnie jak w standardowych programach C, argument 0 zawiera ścieżkę do aktualnie wykonywanego skryptu. Możesz użyć,
%~dp0
aby uzyskać tylko część ścieżki zerowego argumentu (który jest bieżącym skryptem) - ta ścieżka jest zawsze w pełni kwalifikowaną ścieżką.Możesz również uzyskać w pełni kwalifikowaną ścieżkę pierwszego argumentu, używając
%~f1
, ale daje to ścieżkę zgodnie z bieżącym katalogiem roboczym, co oczywiście nie jest tym, czego chcesz.Osobiście często używam
%~dp0%~1
idiomu w moim pliku wsadowym, który interpretuje pierwszy argument w stosunku do ścieżki wykonującej partii. Ma jednak wadę: nieszczęśliwie zawodzi, jeśli pierwszy argument jest w pełni kwalifikowany.Jeśli potrzebujesz obsługiwać zarówno ścieżki względne, jak i bezwzględne, możesz skorzystać z rozwiązania Frédéric Ménez : tymczasowo zmień bieżący katalog roboczy.
Oto przykład, który zademonstruje każdą z tych technik:
Jeśli zapiszesz to jako c: \ temp \ example.bat i uruchomisz go z c: \ Users \ Public jako
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... zobaczysz następujący wynik:
dokumentację dotyczącą zestawu modyfikatorów dozwolonych w argumencie wsadowym można znaleźć tutaj: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
źródło
%0
i%1
podobnie:%~dpnx0
dla pełnej ścieżki + nazwa samego pliku wsadowego,%~dpnx1
dla pełnej ścieżki + nazwa pierwszego argumentu [jeśli w ogóle jest to nazwa pliku]. (Ale jak nazwałbyś plik na innym dysku, gdybyś i tak nie podał tej pełnej informacji o ścieżce w linii poleceń?)d:\foo\..\bar\xyz.txt
można nadal znormalizować. Zalecam użycie tego podejścia z odpowiedzią @ axel-heider poniżej (używając podprogramu wsadowego - wtedy możesz to zrobić na dowolnej zmiennej, a nie tylko zmiennej numerowanej).Dziś rano spotkałem się z podobną potrzebą: jak przekonwertować ścieżkę względną na ścieżkę bezwzględną w skrypcie poleceń systemu Windows.
Oto co załatwiło sprawę:
źródło
pushd .
zapobiega temu problemowi.Większość z tych odpowiedzi wydaje się szalona przez skomplikowane i bardzo błędne, oto moje - działa na każdej zmiennej środowiskowej, bez
%CD%
lubPUSHD
/POPD
lubfor /f
nonsensem - po prostu zwykłe stare funkcje wsadowe. - Katalog i plik nie muszą nawet istnieć.źródło
%~f1
to, że jest po prostu skrótem%~dpfn1
- więc możesz go%~f1
zamiast tego użyć . 🙂 - w długim formacie~
oznacza usunięcie cudzysłowów,d
oznacza dysk,p
oznacza ścieżkę,n
sama byłaby nazwą pliku bez rozszerzenia, alefn
oznacza nazwę pliku z rozszerzeniem.1
oznacza pierwszy argument. - (Bez konieczności posiadania innego pliku wsadowego do przekazywania argumentów (i używania operatorów argumentów), możesz użyć
FOR /F
:gdzie
i
in%%~fi
jest zmienną zdefiniowaną w/F %%i
. na przykład. gdybyś to zmienił,/F %%a
to ostatnia część byłaby%%~fa
.Aby zrobić to samo słuszne w wierszu poleceń (a nie w pliku wsadowym) zastąpić
%%
z%
...źródło
cd
polecenie niekoniecznie zmienia%CD%
zmienną środowiskową (jeśli na przykład jesteś na dysku,D:
a ścieżka docelowa jest włączonaC:
)cd /D D:\on.other.drive
FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fi
nie powiedzie się, jeśli..\relativePath
zawiera spacjefor /?
sugeruje użycie wielkich liter w nazwach zmiennych, aby uniknąć nieporozumień z parametrami podstawiania/F
nie będzie działać na ścieżkach, które nie istnieją, i rozwiąże znaki wieloznaczne. Jeśli chcesz tego, świetnie, ale jeśli chcesz funkcjonalność/F
, wystarczy użyćtokens
słowa kluczowego:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
Ma to pomóc wypełnić luki w odpowiedzi Adriena Plissona (którą należy zaopiniować, gdy tylko ją zredaguje ;-):
Można sobie z tym poradzić
%0
i%1
podobnie:%~dpnx0
dla w pełni kwalifikowanego dysku + ścieżka + nazwa + rozszerzenie samego pliku wsadowego,%~f0
również wystarczy;%~dpnx1
dla w pełni kwalifikowanego dysku + ścieżka + nazwa + rozszerzenie pierwszego argumentu [jeśli w ogóle jest to nazwa pliku],%~f1
również wystarcza;%~f1
będzie działać niezależnie od tego, jak podałeś swój pierwszy argument: ze ścieżkami względnymi lub ścieżkami bezwzględnymi (jeśli nie określisz rozszerzenia pliku podczas nadawania nazwy%1
, nie zostanie on dodany, nawet jeśli użyjesz%~dpnx1
- jednak.Ale jak, u licha, nazwałbyś plik na innym dysku , gdybyś nie podał tej pełnej informacji o ścieżce w linii poleceń?
Jednak
%~p0
,%~n0
,%~nx0
i%~x0
może się przydać, powinien być zainteresowany w ścieżce (bez litera_dysku), nazwę pliku (bez rozszerzenia), pełną nazwę pliku z rozszerzeniem lub tylko rozszerzenie pliku jest. Ale zwróć uwagę, że while%~p1
i%~n1
będzie działać, aby znaleźć ścieżkę lub nazwę pierwszego argumentu,%~nx1
i%~x1
nie doda + pokaż rozszerzenia, chyba że użyłeś go już w linii poleceń.źródło
%~dpnx1
polega na tym, że podaje w pełni kwalifikowaną ścieżkę argumentu względem bieżącego katalogu , podczas gdy OP chce ścieżki względnej do katalogu, w którym znajduje się plik wsadowy .%~dpnx1
podaje w pełni kwalifikowaną ścieżkę pierwszego argumentu. Zupełnie nie względny , ani też nie w stosunku do obecnego reż. Tod
jest dla dysku, top
jest dla ścieżki,n
jest dla sufiksu bez nazwy pliku,x
jest dla sufiksu,1
jest dla pierwszego argumentu. - A pytanie Nathana brzmiało: „Czy istnieje sposób na zwrócenie bezwzględnej ścieżki z wartości zawierającej nazwę pliku i / lub ścieżkę względną?”Możesz również użyć do tego funkcji wsadowych:
źródło
Małe ulepszenie doskonałego rozwiązania BrainSlugs83 . Uogólnione, aby umożliwić nazwanie wyjściowej zmiennej środowiskowej w wywołaniu.
Jeśli uruchomienie z
C:\project
wyjścia to:źródło
Nie widziałem wielu rozwiązań tego problemu. Niektóre rozwiązania wykorzystują przemierzanie katalogów za pomocą CD, a inne wykorzystują funkcje wsadowe. Osobiście preferowałem funkcje wsadowe, aw szczególności funkcję MakeAbsolute dostarczaną przez DosTips.
Ta funkcja ma pewne realne korzyści, przede wszystkim to, że nie zmienia bieżącego katalogu roboczego, a po drugie, oceniane ścieżki nie muszą nawet istnieć. Można znaleźć kilka pomocnych wskazówek, jak korzystać z funkcji tutaj też.
Oto przykładowy skrypt i jego wyniki:
A wynik:
Mam nadzieję, że to pomoże ... Na pewno mi pomogło :) PS Jeszcze raz dziękuję DosTips! Rządzisz!
źródło
Możesz je po prostu połączyć.
wygląda to dziwnie z \ .. \ na środku ścieżki, ale działa. Nie musisz robić nic szalonego :)
źródło
echo %~dp0..\SomeFile.txt
W naszym przykładzie z Bar \ test.bat DIR / B / S .. \ somefile.txt zwróci pełną ścieżkę.
źródło
PowerShell jest obecnie dość powszechny, więc często używam go jako szybkiego sposobu wywoływania C #, ponieważ ma on funkcje dla prawie wszystkiego:
Jest trochę powolny, ale uzyskana funkcjonalność jest trudna do pokonania, chyba że bez uciekania się do rzeczywistego języka skryptowego.
źródło
rozwiązanie stijn działa z podfolderami pod
C:\Program Files (86)\
,źródło
Pliki Zobacz wszystkie inne odpowiedzi
Katalogi
Z
..
bycia swoją ścieżką względną, a zakładając, że jesteś obecnie wD:\Projects\EditorProject
:cd .. & cd & cd EditorProject
(ścieżka względna)zwraca ścieżkę bezwzględną np
D:\Projects
źródło
źródło