Como posso extrair a letra da unidade para uma nova unidade mapeada em um .bat?

5

Estou criando um script simples de backup de linha de comando para usar o robocopy para espelhar coisas "importantes" em minha caixa NAS. Eu preferiria não confiar em uma letra de unidade mapeada codificada para essa caixa NAS. No script, gostaria de mapear uma letra de unidade temporária, copiar os arquivos relevantes e descartar a unidade mapeada. Não quero supor que, se essa letra da unidade já estiver mapeada, ela esteja apontando para o lugar que eu esperava. Eu também não quero "assumir" que alguma letra de unidade está disponível quando eu mapear a unidade, assim, o líder "*".

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

Qual é a maneira correta dentro do meu script .bat para extrair essa letra de unidade para uso em comandos subseqüentes? Eu estava pensando que poderia reunir uma variante da análise de token de "for", mas também suspeito que deve haver um caminho mais fácil do que a sintaxe esotérica.

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

    The command completed successfully.


    C:\>

Quando tiver a letra da unidade mapeada, gostaria de seguir com os comandos nas seguintes linhas:

    robocopy C:\path\to\important\stuff %NewDrive%\path\to\backup /MIR /Z
    
por JMD 21.10.2009 / 22:59

2 respostas

6

Use os comandos pushd e popd .

pushd \server\share criará uma unidade temporária (começando de Z: e retrocedendo até encontrar uma letra disponível) e entrará nela. Quando terminar, popd excluirá a unidade temporária e fará com que você volte para onde você estava.

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.
    
por 21.10.2009 / 23:01
1

E, para a posteridade, aqui está um modelo aproximado de como tudo isso funciona. Obrigado novamente ao @Snark e @Neal.

Aqui está meu modelo original, usando o 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

Note que, com a minha revelação do comentário do @Neal, minha aplicação específica do pushd / popd é desnecessária aqui, e a forma do comando robocopy simplesmente muda para:

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

Não há necessidade de votar. Só queria tê-lo aqui como migalha de pão para os outros que encontrarem isso mais tarde.

    
por 21.10.2009 / 23:53