Jak zrobić względną ścieżkę - konsola


(Dudix3) #1

Witam, mam taki problem, a mianowicie chcę skopiować określony plik z określonej lokalizacji za pomocą pliku wsadowego bat. Niestety potrzebuję uniwersalnej ścieżki do określonego programu, jednak za każdym razem po instalacji program robi inną losową nazwę folderu. Przykład: chcę zapisać komendę copy d:\program\nazwa.folder\plik C:\miejsce_docelowe\ jako element pliku wsadowago w bat niestety zamiast nazwa.folder program przy instalacji zawsze nazywa ten folder lzxcvbnm8.folder przy czym zxcvbnm8 to losowo generowane znaki. Potrzebuję tego do ściśle określonego celu, ale niestety musi to działać dla tego programu na każdym komputerze, a jak wiadomo na każdym takim kompie folder będzie nosił inną nazwę, więc plik się nie skopiuje, a cała reszta bata nie zadziała jak należy. Czy istnieje jakiś tag, który pozwolił by automatyczny lub domyślny wybór folderu (na poziomie folderu nazwa.folder nie ma innych folderów)? Wiem, że np. istnieją tagi (czy jak to tam zwać) takie jak %Windir% czy %CE1% które w zasadzie są etykietą konkretnych folderów lub ../folder1/folder2/ Dlatego potrzebne mi coś co za tag podstawiło by nazwę jedynego folderu na poziomie na którym ma znajduje się tylko jeden folder a mianowicie nazwa.folder. Wiem, że to trochę trudne i skomplikowane pytanie, ale nie mam pojęcia czy takie coś w ogóle istnieje, ale muszę przyznać, że losowość tego folderu sprawia ogromny problem. Pozdrawiam i czekam na pomoc.


(system) #2

A myślałeś o wylistowaniu zawartości katalogu d:\program\ do zmiennej i następnie wykorzystaniu tej zmiennej w poleceniu copy (copy d:\program\%ZMIENNA%\plik c:\kat_docelowy)?

Nie wiem na ile to zadziała, ale taki mi przyszedł pomysł do głowy :wink:


(Dudix3) #3

No chyba wiem o co ci chodzi, ale jestem trochę zielony, a w zasadzie to dopiero zaczynam. Jak wylistować katalog i podstawić wynik za nazwę zmiennej. Czy chodzi ci o to że np komenda dir wyświetli zawartość katalogu d:\program\ a wynik, czyli nazwę wykrytego katalogu podstawi za zmienną? Mógł byś mi to przedstawić lub wytłumaczyć? Dzięki za odpowiedź.


(mareksolak) #4

coś mi tu wirusem zalatuje

tyle że przy losowo zmienianej nazwie/lokalizacji pliku to sie nie sprawdzi


(Dudix3) #5

Plik wsadowy ma robić kopię zapasową archiwum pak który musi przekopiować do folderu zapasowego, ale program przy instalacji robi losową nazwę pliku. Później uruchamiając plik ponownie można za potwierdzeniem pliki przywrócić i podmienić, bądź zrobić kolejną kopię. W zasadzie to chodzi o edytor do gry który instaluje się osobno, ale za cholerę nie wiem czemu robi losową nazwę folderu w którym zapisuje mapy, a wszystkie mapy (nawet nowo zrobione) pakuje do pliku pak. Ma to po prostu ułatwić pracę, bo dość często coś ktoś zapisze i już potem nie da się tego cofnąć. Wirus?! Skąd ci to przyszło do głowy? Plikiem wsadowym można komuś narobić szkód to akurat wiem, ale kopiowanie, to już inna bajka. To jak mam to w końcu zrobić bu już biegam po necie i się gubię.

EDIT: Hmm komenda dir po podaniu ścieżki katalogu o poziom wyżej od losowo nazwanego folderu wyświetla jego nazwę a przy użyciu /s wyświetla kompletną ścieżkę (wraz z losowym folderem) i listę plików wraz z user_maps.pak czy da się o jakoś wykorzystać?


(pawcio1212) #6

jakbyś zrobił tak

d:\program*.pak

wtedy powinien skopiować wszystkie pliki z rozszerzeniem .pak


(Dudix3) #7

Nie można odnaleźć określonego pliku, po za tym wewnątrz folderu są inne paki i dwa z nich ważą dość sporo, więc kopiowanie wszystkich jest trochę uciążliwe. Nie znając określonej lokalizacji, plik nie zostanie znaleziony, a że nazwa folderu jest losowa, to na innych kompach program nie odnajdzie pliku. Nie wiem jak sprawić, aby plik został po prostu wyszukany i skopiowany do wybranej lokalizacji lub jak to zrobić z tym wylistowaniem i podstawieniem do zmiennej.


(pawcio1212) #8

dobrze rozumiem chcesz skopiować 2 pliki które mają za każdym razem inną nazwę nie kupując innych plików

powiem wprost nie da się tak zrobić ponieważ on nie ty on nie uruchomi programu i nie sprawdzi czy to jest to czy nie

PS jeśli plik ma pewną część taką samą to to co zmienia się zastąp gwiazdką


(Dudix3) #9

Losowa jest nazwa folderu nie pliku, plik pozostaje bez zmian tylko nazwa folderu na jednym z poziomów jest losowa. Chcę przeskoczyć o jeden poziom w dół do folderu z plikiem, aby go skopiować. Przeczytaj dokładnie pierwszy post, bo to trochę zagmatwane.


(system) #10

Dlaczego ma nie zadziałać? Przy każdym uruchomieniu skryptu pod zmienną %ZMIENNA% podstawiany byłby aktualny (istniejący) katalog w ścieżce d:\program.


(pawcio1212) #11

tylko że zmienną trzeba było ręcznie wprowadzać to już lepiej ręcznie wejść i skopiować(niektórzy tak mają że chcą se ułatwić a im nie wychodzi i se utrudniają np zamiast dać skrót do d:\program\ to robią plik bat który szuka pliku i nie znajduje i oni się głowią przez parę tygodni nad tym i tak nie działa więc tylko tracą czas)


(Dudix3) #12

No już dość obszernie to rozbudowałem, ta funkcja kopiowania to pikuś w tym co tam jest i w zasadzie to całe narzędzie ułatwiające pracę. Koniecznie muszę znaleźć rozwiązanie.


(system) #13

Mam wrażenie, że nikt z wypowiadających się w wątku osób (poza autorem, który zrozumiał mój pomysł ale nie wie jak go zrealizować) nie przeczytał mojego rozwiązania.

  1. Uruchamiamy skrypt.

  2. Skrypt przechodzi do katalogu d:\program.

  3. Następnie listuje zawartość w/w katalogu i wydobywa z niego nazwę jedynego katalogu, czyli lzxcvbnm8.folder (katalog podany w pierwszym poście) i przypisuje go do pewnej zmiennej.

  4. Ostatnie polecenie w skrypcie wykorzystujące zadeklarowaną zmienną do wykonania kopii.

Gdzie tu jest ręczne wprowadzanie zmiennej, nie wiem? Problemem - swoją drogą pewnie nie małym - może być punkt 3. Jak z listingu wydobyć samą nazwę katalogu, pomijając resztę informacji? Rozwiązanie pewnie nie idealne, ale czy nie możliwe do zrealizowania?

Nie mi to oceniać :wink:


(pawcio1212) #14

plikiem bat tego się nie da zrobić ale pamiętam że jakimś programem dało się zrobić żeby kierował myszka i klawiaturą np kliknąć tam i tam później to wpisał

więc tym programem dało by się to zrobić tylko że wtedy by nic się nie dało robić i to by trochę potrwało

np

ma otworzyć wyszukiwarkę w tamtym folderze (d:program) i wyszukać ten plik po czym skopiować go np na pulpit albo w miejsce swojego znajdowania

ten program to chyba

AutoIt

a ten program tworzy exe czyli na innym kompie nie musi być on zainstalowany


(Drobok) #15

dir /s /b /ad folder_poprzedni

Listujesz same ścieżki, eliminujesz wszystkie stałe i zostaje ci ta którą chcesz. Niby proste, a taki ekspert jak autor tego tematu nie jest sobie w stanie z tym poradzić ;]

Ew jest coś takiego jak xcopy i exclude, bez listowania. Wystarczy wykluczyć pliki stałe, a reszta się skopiuje. Ale przecież autor tematu o komendach wiersza poleceń powinien takie rzeczy wiedzieć, szczególnie, że to jest w help a to niby tylko 5% wszystkich komend jakie zna autor tematu.

Btw kto to widział robić takie rzeczy plikami wsadowymi ? Wydajniej jest to napisać czymkolwiek innym, dodatkowe możliwości etc.

Innych użytkowników przepraszam za wjazd na ambicję autora tematu jednak uraziło mnie bardzo jego podejście co do konsoli i wiedzy innych w poprzednim temacie dot. wiersza poleceń win7.


(system) #16

Z ciekawości aż przelogowałem się do Windowsa, i faktycznie polecenie które podał drobok jest ścieżką bezwzględną do katalogu o losowej nazwie bez zbędnych śmieci :wink: Czyli można to zrobić batem :stuck_out_tongue:


(Dudix3) #17

Czytałem skrawek postu droboka i zamarłem, bo wyraźnie napisałem, że jestem zielony, a tamten temat z góry był skazany przez zbędną krytykę na kosz (są tu tematy typu odgadnij screena na 500 postów, więc nie rozumiem czepiania się mojego). Hugsy jestem zielony i próbowałem, to zrobić :frowning: Na necie różne przykłady widziałem, ale nie do tego co trzeba i próbowałem coś ułożyć, ale nie chce mi działać, bo wszystko się mi już miesza. Mógł byś ułożyć przykład z informacji, które podałem, bo siedzę nad tym już cały dzień i ciągle coś nie działa.

EDIT Studia w tym roku zaczynam, więc może w końcu się nauczę programowania, proszę się nie czepiać moich ambicji.


(system) #18

Spróbuj z tym (zmienne musisz dopasować do swoich potrzeb, MAINDIR to katalog źródłowy, DSTDIR to katalog docelowy, FILETEMP to nazwa pliku tymczasowego z nazwą katalogu o losowej nazwie).

@echo off

set MAINDIR=c:\test\

set DSTDIR=c:\test2\

set FILETEMP=dirname.tmp


cd %MAINDIR%

dir /s /b /ad > %FILETEMP%

set /p SCIEZKA= <%FILETEMP%


copy %SCIEZKA%\NAZWAPLIKU %DSTDIR%

echo "Kopiowanie zakonczone"


DEL %FILETEMP%

set MAINDIR=

set DSTDIR=

set FILETEMP=


pause

(Dudix3) #19

Działa! !!


(system) #20

Cieszy jak działa :wink: jednak podziękowania należą się koledze drobok bo to On podał najważniejszą komendę w skrypcie :slight_smile: