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.