Blogrys

Kopiowanie w Windowsie

Od miesiąca znowu i niestety korzystam z Windowsa. „Znowu i niestety” – gdyż pomiędzy wiosną 2023 roku a tegorocznymi wakacjami korzystałem (po blisko piętnastoletniej przerwie) z systemów linuksowych. Było to doświadczenie tak odmładzające, przyspieszające oraz pouczające, że miałem szczerą nadzieję i serdeczny zamiar nigdy do Okien nie wracać. Cóż, nowa praca, nowy laptop, BIOS zablokowany hasłem, więc Fedory z pendraka nie wczytam. Musiałem przeprosić się z Win11. Człowiek strzela, admin kule nosi.

Mam w planach notkę, w której wyłożę wszystkie powody, dla których Linuksy (tudzież para-Uniksy – na komputerze domowym zainstalowałem FreeBSD) górują nad Windowsami. Mimo to postanowiłem podejść do Windy bez uprzedzeń, polubić ją na nowo (bo przecież kiedyś lubiłem!), dostrzec zalety, skonfigurować według własnych upodobań. Co rusz jednak napotykam się na dziwaczne przeszkody, które wzbudziłyby uśmiech politowania na twarzy linuksiarza.

Operacyjnosystemowy aforyzm głosi, że czciciele Pingwina specjalizują się w rozwiązywaniu problemów niewystępujących na Windowsach. Z punktu widzenia tzw. power usera, czyli osoby lubiącej korzystać z tekstowej linii poleceń i chętnie grzebiącej w ustawieniach, uważam, że w powyższym powiedzonku należałoby zamienić bieguny.

O co chodzi? W folderze dzielonym między komputerami za pomocą OneDrive1 przechowuję między innymi bookmarks.db, bazę danych wyśmienitego, tekstowego menedżera zakładek buku. Ponieważ trzymam w niej URL-owe zapiski z ostatnich dwudziestu lat – jakieś siedemset zakładek, wśród których prędzej czy później będę musiał przeprowadzić remanent – i ponieważ nie do końca ufam binarnym plikom przechowującym intensywnie redagowane dane2, postanowiłem napisać prosty skrypt, który co tydzień wykona kopię zapasową zakładek do lokalnego folderu.

@echo off
set source=C:\Users\bojaa003\OneDrive\BukuBookmarks\bookmarks.db
set destination=C:\Users\bojaa003\MyFiles\Backup\Buku\
set dateSuffix=%date:~-4,4%%date:~-10,2%%date:~-7,2%
# Tutaj kopiowanie
for /f "skip=5 delims=" %%i in ('dir /b /o-d "%destination%\bookmarks_*"') do del "%destination%\%%i"

Ostatnia zawiła linijka pozostawia przy życiu pięć ostatnich kopii kasując starsze (w praktyce: szóstą najstarszą). Nie w niej szkopuł. Więcej problemów sprawiła mi implementacja linijki przedostatniej, pozornie banalnej.

Jaka komenda służy do kopiowania w windowsowym wierszu poleceń? Otóż są aż trzy, co samo w sobie zakrawa na absurd: copy, xcopy, robocopy. robocopy jest wynalazkiem najnowszym (z 1996 r., ale zakorzeniło się w Windzie dopiero w 2008), więc sięgnąłem po nie najpierw. I okazało się, że chociaż „robot” posiada multum opcji związanych z transferami sieciowymi, to nie potrafi rzeczy najprostszej: zmiany nazwy kopiowanego pliku (sic!). Czyli nie potrafi przechrzcić za jednym zamachem bookmarks.db na bookmarks-2024-09-15.db. Musiałbym wyczyniać dodatkową akrobatykę przy pomocy mv.

A więc lepiej xcopy, które zmieniać nazwy potrafi. Składnia xcopy nie zawsze jednak odróżniania katalogi od plików (sic!). Jeżeli każemy skopiować mu foo do bar, dobrodusznie zapyta, czy bar to nowa nazwa pliku, czy raczej katalog, do którego foo chcemy zduplikować. Pytanie rozsądne. Rzecz w tym, że tego rozróżnienia nie da się w naturalny sposób dokonać przy układaniu wiekuistej komendy. A ja chciałbym, żeby zakładki kopiowały się w stu procentach automatycznie, bez jakiejkolwiek ingerencji z mojej strony, nawet jeśli ingerencja owa miałaby polegać tylko na naciśnięciu klawisza F na nowej, wspaniałej klawiaturze Keychron K103.

Co podpowiada internet? Żeby przed skopiowaniem pliku utworzyć pusty plik o pożądanym tytule, a potem wycelować weń xcopy zmuszając go do nadpisania „destynacji”. Ale jak tworzy się pusty plik w windowsowym wierszu poleceń? Najwyraźniej da się to zrobić na wiele sposobów. Jednak gdy testowałem pierwszy z brzegu

copy NUL EmptyFile.txt

to okazało się, że PowerShell go nie rozumie i muszę otworzyć „starożytny” Command Prompt.

Koniec końców mój skrypt wygląda tak:

@echo off
set source=C:\Users\bojaa003\OneDrive\BukuBookmarks\bookmarks.db
set destination=C:\Users\bojaa003\MyFiles\Backup\Buku\
set dateSuffix=%date:~-4,4%%date:~-10,2%%date:~-7,2%
copy NUL "%destination%\bookmarks_%dateSuffix%.db"
xcopy /Y "%source%" "%destination%\bookmarks_%dateSuffix%.db"
for /f "skip=5 delims=" %%i in ('dir /b /o-d "%destination%\bookmarks_*"') do del "%destination%\%%i"

Czego dowiedziałem się o Windowsach, które chciałbym szczerze polubić na nowo i dostrzec ich zalety?

  • Że mają trzy różne komendy do kopiowania plików.
  • Że jedna z nich nie umie zmieniać nazwy kopiowanego pliku.
  • Że inna ma pewien (drobny, ale natychmiast się manifestujący) kłopot z odróżnianiem plików od katalogów.
  • I że Windowsy posiadają dwie powłoki, z których jedna rozumie tylko podstawowe komendy, a druga – wyłącznie zaawansowane (rozwlekłość komend PowerShellowych to zresztą temat na inną notkę).
  1. O dziwo, właśnie Microsoftowy OneDrive doczekał się aplikacji, która bez tarć działa na FreeBSD. 

  2. Jestem wielkim fanem zwykłego TXT. Parę razy już mi się zdarzyło, że dane trzymane w formacie bazodanowym zostały uszkodzone albo nawet bezpowrotnie utracone wskutek niedomknięcia transakcji. Natomiast pliki tekstowe można na przemian podpalać i topić. Wszystko zniosą. 

  3. Stukanie w klawisze nigdy nie było tak rozkoszne. O Keychronie napiszę więcej przy innej sposobności. Tylko trochę smutne, że w moim wieku człowieka najbardziej rajcują nowe klawiatury. 






Komentarze

rozie (2024-09-14 16:48:29)

Czemu nie copy, po prostu?
copy "%source%" "%destination%\bookmarks_%dateSuffix%.db"

Dla powershell GPT podpowiada
Copy-Item -Path $sourceFile -Destination $destFile -ErrorAction Stop

Borys (2024-09-16 09:24:47)

Cóż, teraz będę wiedział, że jeżeli Windowsowy standardowy wiersz poleceń ma kilka wariantów tej samej komendy, to muszę zaczynać od najstarszej, nie od najnowszej. :)

PowerShella ciągle obwąchuję podejrzliwie.

rozie (2024-09-20 08:31:28)

No tak, to trochę jak w kuchni. Jak chcesz coś pokroić to najpierw sięgasz po nóż, nie po robota wielofunkcyjnego. ;-)

Liczyłem po cichu, że jest błąd. Skopali copy i nie radzi sobie z danymi binarnymi. I dlatego powstały kolejne narzędzia.

Docenić sformułowana zdań ostatnich należy. Myśl sztuczną uczące być może się zniszczą. Zaś człek przekaz obejmie.



C O M E C O N