5

Я создаю простой скрипт резервного копирования из командной строки, чтобы использовать robocopy для зеркального отображения "важных" вещей на моем NAS-устройстве. Я бы предпочел не полагаться на жестко запрограммированную букву диска для этого блока NAS. В сценарии я хотел бы отобразить временную букву диска, скопировать соответствующие файлы и утилизировать подключенный диск. Я не хочу предполагать, что, если эта буква диска уже сопоставлена, она указывает на то место, которое я ожидаю. Я также не хочу "предполагать", что какая-то буква диска доступна, когда я сопоставляю диск, таким образом, ведущий '*'.

    net use * \\nasbox\sharename password /user:username /persistent:no

Как правильно в моем скрипте .bat извлечь эту букву диска для использования в последующих командах? Я думал, что смогу собрать воедино какой-то вариант синтаксического анализа "for", но я также подозреваю, что должен быть более простой способ, чем эзотерический синтаксис for.

    C:\>net use * \\nasbox\sharename password /user:username /persistent:no
    Drive Z: is now connected to \\nasbox\sharename.

    The command completed successfully.


    C:\>

После того, как у меня есть обозначенная буква диска, я хотел бы выполнить следующие команды:

    robocopy C:\path\to\important\stuff %NewDrive%\path\to\backup /MIR /Z

2 ответа2

6

Используйте команды pushd и popd .

pushd \\server\share создаст временный диск (начиная с Z: и двигаясь назад, пока не найдет доступную букву) и войдет в него. Когда вы закончите, popd удалит временный диск и вернет вас туда, где вы были.

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.
1

И, для потомков, вот примерный пример того, как все это работает. Еще раз спасибо @Snark и @Neal.

Вот мой оригинальный шаблон с использованием pushd/popd.

    @echo off

    :: Supply credentials for the NAS share.
    net use \\nasbox\sharename password /user:username /persistent:no
    :: Make sure it worked.
    if ERRORLEVEL 1 echo NET USE returned %ERRORLEVEL% && goto :EOF

    :: Use pushd to supply a drive letter for the share.
    pushd \\nasbox\sharename

    :: Copy the files to be backed up. Rinse and repeat.
    robocopy C:\path\to\important\stuff .\path\to\backups /MIR /Z

    :: Release the temporary drive letter.
    popd

    :: Optionally, revoke the credentials while the share's not in use.
    net use \\nasbox\sharename /delete

Обратите внимание, что с моим откровением из комментария @ Neal мое конкретное применение pushd/popd здесь не нужно, и форма команды robocopy просто меняется на:

    robocopy C:\path\to\important\stuff \\nasbox\sharename\path\to\backups /MIR /Z

Нет необходимости голосовать за это. Просто хотел, чтобы это было здесь как хлебная крошка для тех, кто найдет это позже.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .