diretório atual em lote ao iniciar como administrador

2

Histórico:

Eu gosto de ter meu computador limpo. Especialmente eu não gosto de programas e serviços que começam com minhas janelas, mas eu ainda quero usar todos os meus programas sem ter que iniciar serviços e dependências manualmente. Razoável, certo? Também quero poder iniciar a maioria dos meus programas via linha de comando.

Ambiente

No meu diretório de usuário eu tenho uma pasta bin contendo links simbólicos (arquivos .lnk) apontando para o respectivo programa (program.lnk aponta para um programa chamado programa). Esta pasta bin está incluída na minha variável de ambiente PATH.

Se um programa tiver uma dependência, por ex. um serviço, o link não aponta diretamente para o programa, mas para um pequeno script BATch localizado em uma subpasta da pasta bin. Esse script inicia os serviços suficientes e, em seguida, inicia o programa. Um script simplificado se parece muito com isso:

:restart
net start "Nessesary Service"
net start | find "Nessesary Service" > nul 2>&1
if %errorlevel%==0 goto start
goto restart
:start
start program.lnk
exit

O programa.lnk está localizado na mesma subpasta em que os scripts estão e agora aponta para o programa real que deve ser iniciado. Mas tem o mesmo nome que o link inicial na pasta bin.

O problema real:

Se eu agora abrir o Run (batendo no Windows + R) e digitar program (ou program.lnk no cmd), ele localizará o program.lnk através da minha variável PATH na pasta bin, seguindo o link para a subpasta e executa o script. Os scripts iniciam o serviço e, quando chega à linha "start program.lnk", as coisas estranhas começam.

Parece que segue o PATH novamente quando o mesmo script está sendo executado novamente. Mas ao invés de abrir outra instância do cmd com o script start quando ele atinge a linha "program.lnk" ele agora abre o link na sub-pasta e assim, iniciando o programa.

Então tudo que vejo são duas janelas cmd por um curto período de tempo.

Minha pergunta

Minha pergunta é: PORQUE, claro. Por que ele abre o link encontrando o link através da minha variável PATH em vez de olhar para o diretório primeiro e encontrar o link program.lnk? E por que então não faz a mesma coisa na segunda instância do script? Eu verifiquei através do taskmanager os argumentos da linha de comando dos processos do CMD através do gerenciador de tarefas e eles são exatamente os mesmos. Eu sou incapaz de fazer cabeça ou cauda disso, qualquer ajuda é apreciada:)

Editar

Eu fiz mais alguns testes e, ao que parece, o diretório atual do primeiro shell não é o bin-folder, mas o system32. O segundo cmd começa com o diretório correto e, portanto, inicia o programa. O estranho é:

Este é apenas o caso quando o atalho inicial é definido para iniciar com direitos de administrador (propriedades - > atalho - > Avançado), que é necessário para iniciar o serviço. Eu não sei porque isso é, mas pelo menos isso resolve isso para mim. Eu usei isso para fazer o admin de solicitação de script por si mesmo e não por meio da chamada de atalho.

    
por Zaheylu 05.04.2015 / 23:11

1 resposta

1

Ok, na verdade, está apenas começando um script em lote com privilégios de administrador. E depois de identificar o problema real, você pode facilmente encontrar uma resposta. Por exemplo, aqui . Um simples

cd %~dp0

no começo faz o truque.

Informações sobre parâmetros de lote Informações sobre lote parâmetros

    
por 09.04.2015 / 12:02