Jak mogę wyodrębnić literę dysku dla nowego dysku zamapowanego w .bat?

5

Tworzę prosty skrypt kopii zapasowej z wiersza polecenia, aby za pomocą robocopy wykonać kopię lustrzaną „ważnych” rzeczy na moim urządzeniu NAS. Wolałbym nie polegać na mocno zakodowanej literze dysku dla tego urządzenia NAS. W skrypcie chciałbym zmapować literę dysku tymczasowego, skopiować odpowiednie pliki i zutylizować zmapowany dysk. Nie chcę zakładać, że jeśli litera dysku jest już zmapowana, wskazuje na miejsce, którego oczekuję. Nie chcę też „zakładać”, że litera dysku jest dostępna, gdy mapuję dysk, a więc wiodące „*”.

    użycie netto * \\ nasbox \ nazwa_udziału hasło / użytkownik: nazwa użytkownika / trwały: nie

Jaki jest właściwy sposób w moim skrypcie .bat, aby wyodrębnić tę literę dysku do użycia w kolejnych poleceniach? Myślałem, że mogę złożyć jakiś wariant analizy składniowej „for”, ale podejrzewam również, że musi istnieć łatwiejszy sposób niż ezoteryczna for-składnia.

    C: \> wykorzystanie netto * \\ nasbox \ nazwa_udziału hasło / użytkownik: nazwa użytkownika / trwały: nie
    Dysk Z: jest teraz podłączony do \\ nasbox \ sharename.

    Polecenie zostało wykonane pomyślnie.


    C: \>

Po otrzymaniu zmapowanej litery dysku chciałbym wykonać polecenia w następujący sposób:

    robocopy C: \ ścieżka \ do \ ważna \ stuff% NewDrive% \ ścieżka \ do \ backup / MIR / Z
JMD
źródło
1
Interesujące pytanie w ogólnym przypadku i dobra zaakceptowana odpowiedź, ale czy nie lepiej byłoby użyć nazwy UNC w poleceniu Robocopy? robocopy C: \ ścieżka \ do \ ważna \ rzeczy \\ nasbox \ nazwa_udziału \ ścieżka \ do \ kopia zapasowa / MIR / Z
Neal
Hmm, teraz jest to interesująca propozycja, którą powinienem był najpierw rozważyć. Ponieważ roboycopy obsługuje ścieżki UNC (właśnie go przetestowałem), to tak, zamiast tego przełączę się na ten formularz. Powiedziawszy to, podejrzewam, że nadal znajdę zastosowanie dla wzorca pushd / popd, niezależnie od tego. +1
JMD

Odpowiedzi:

6

Użyj poleceń pushdi popd.

pushd \\server\shareutworzy dysk tymczasowy (zaczynając od Z: i cofając się, aż znajdzie dostępną literę) i przejdzie do niego. Gdy skończysz, popdusunie dysk tymczasowy i przywróci Cię tam, gdzie byłeś.

C:\Users\Snark>pushd /?
Stores the current directory for use by the POPD command, then
changes to the specified directory.

PUSHD [path | ..]

  path        Specifies the directory to make the current directory.

If Command Extensions are enabled the PUSHD command accepts
network paths in addition to the normal drive letter and path.
If a network path is specified, PUSHD will create a temporary
drive letter that points to that specified network resource and
then change the current drive and directory, using the newly
defined drive letter.  Temporary drive letters are allocated from
Z: on down, using the first unused drive letter found.

C:\Users\Snark>popd /?
Changes to the directory stored by the PUSHD command.

POPD


If Command Extensions are enabled the POPD command will delete
any temporary drive letter created by PUSHD when you POPD that
drive off the pushed directory stack.
Snark
źródło
1

A dla potomnych, oto przybliżony szablon tego, jak to wszystko działa. Jeszcze raz dziękuję @Snark i @Neal.

Oto mój oryginalny szablon, używając pushd / popd.

    @echo wyłączone

    :: Podaj poświadczenia dla udziału NAS.
    użycie netto \\ nasbox \ nazwa_udziału hasło / użytkownik: nazwa użytkownika / trwały: nie
    :: Upewnij się, że zadziałało.
    jeśli ERRORLEVEL 1 echo NET USE zwróciło% ERRORLEVEL% && goto: EOF

    :: Użyj pushd, aby podać literę dysku dla udziału.
    pushd \\ nasbox \ nazwa_udziału

    :: Skopiuj pliki do utworzenia kopii zapasowej. Wypłukać i powtórzyć.
    robocopy C: \ ścieżka \ do \ ważnych \ rzeczy. \ ścieżka \ do \ kopii zapasowych / MIR / Z

    :: Zwolnij literę dysku tymczasowego.
    popd

    :: Opcjonalnie odwołaj poświadczenia, gdy udział nie jest używany.
    użycie netto \\ nasbox \ nazwa_udziału / delete

Zauważ, że dzięki mojemu odkryciu z komentarza @ Neal, moja konkretna aplikacja pushd / popd nie jest tutaj potrzebna, a forma polecenia robocopy po prostu zmienia się na:

    robocopy C: \ ścieżka \ do \ ważna \ rzeczy \\ nasbox \ nazwa_udziału \ ścieżka \ do \ kopii zapasowych / MIR / Z

Nie ma potrzeby głosowania w tej sprawie. Chciałem mieć go tutaj jako bułkę tartą dla innych, którzy znajdą to później.

JMD
źródło
+1 Ponieważ to zadziałało dla mnie - ta.
Umber Ferrule