Não sei se posto nesta seção, mas...
Estou criando um arquivo bat que deve copiar um arquivo para a pasta"meus documentos" do usuário.
O problema é que, se for usar em outro computador, o caminho pra essa pasta será diferente.
Por exemplo copiar esse arquivo teste.txt para meus documentos:
Primeiramente o meu nome de usuário é User e o nome de usuário em outro computador será diferente.
Ainda tem o problema que no Windows 7 (que eu uso) o caminho pra a pasta do usuário é C:\Users\nome do usuário ao contrário do Windows XP: C:\Documents and Settings\nome do usuario
Eu fiz:
[code=rich]
@echo off
xcopy "C:\teste.txt" "C:\Users\User\Documents"
exit
[/code]Alguém sabe de alguma solução?
Obrigado
- Home
- >
- Fórum
- >
- Profissional
- >
- Programação, Sc...
- >
- Caminho da pasta Meus Doc...
Variável %userprofile% é o caminho da pasta de usuário, no seu caso C:\Users\User.
Por exemplo:
xcopy C:\teste.txt %userprofile%\Documentos
Obs: não entendi o porquê das aspas... Batch não precisa disso.
xcopy "C:\teste.txt" "%userprofile%\Documentos" pode ser escrito xcopy C:\teste.txt %userprofile%\Documentos que dá no mesmo, e você economiza caracteres.
[]'s
Pedro Jotha disse: Variável %userprofile% é o caminho da pasta de usuário, no seu caso C:\Users\User.
Por exemplo:
xcopy C:\teste.txt %userprofile%\Documentos
Obs: não entendi o porquê das aspas... Batch não precisa disso.
[]'s
Ah, obrigado!
Só um probleminha: o %userprofile% vai ser a pasta do usuário, mas no Windows 7 a pasta do Meus Documentos, dentro da pasta do usuario é "Documents", diferente do XP que é "Meus Documentos" memso.
O que eu faço?
* Quanto às aspas: eu nao sei muita coisa de batch, eu achei um modelo assim na internet, mas funciona.
fe_gw disse: Ah, obrigado!
Só um probleminha: o %userprofile% vai ser a pasta do usuário, mas no Windows 7 a pasta do Meus Documentos, dentro da pasta do usuario é "Documents", diferente do XP que é "Meus Documentos" memso.
O que eu faço?
* Quanto às aspas: eu nao sei muita coisa de batch, eu achei um modelo assim na internet, mas funciona.
Em batch não é necessário aspas, pode parar de usá-las. Deixa o código mais limpo sem elas (se você já estiver acostumado, também não tem problema, funciona do mesmo jeito).
Já que há a diferença, é necessário então descobrir qual é a pasta. Fiz um código, veja se funciona.
[CODE=rich]@echo off
if not "%os%"=="Windows_NT" goto soerrado
if not exist %userprofile%\Documents\*.* goto xp
if not exist %userprofile%\Documentos\*.* goto seven
:xp
xcopy C:\teste.txt %userprofile%\Documentos
goto fim
:seven
xcopy C:\teste.txt %userprofile%\Documents
:soerrado
echo Este programa precisa de Windows 2000 ou superior.
goto fim
:fail
echo Erro no processo: Impossivel achar pasta de documentos!
:fim
[/CODE]
Teste aí e me diz se funcionou.
[]'s
Funcionou certinho
Valeu!
As aspas são importantes por questões de compatibilidade com versões mais antigas do sistema. Atualmente não são mais necessárias, mas é uma boa prática.
Fergo
Retomando o assunto, onde é possível listar as variáveis de ambiente do Windows?
Uso apenas Linux e não posso afirmar com certeza, mas experiemente usar o comando SET sem argumentos.
Referências:
Microsoft Windows XP - Command shell overview
Environment Variables in Windows XP
Se alguém souber como obter o diretório de um batch em execução compartilhe conosco por favor. Esse é um problema antigo que retomo p/Win Vista/7.
[]'s
Fergo disse: As aspas são importantes por questões de compatibilidade com versões mais antigas do sistema. Atualmente não são mais necessárias, mas é uma boa prática.
Fergo
Desculpe, Fergo, mas vou ter que descordar com você. Programo batch desde o MS-DOS 5.0 passando por Win95, 98, Me, XP, e 7 e nunca tive que utilizar as tais aspas. Só se for coisa anterior ao MS-DOS 4.x, daí eu realmente não sei, mas não creio que ele vá usar esse arquivo num DOS 4.x ou inferior, até mesmo porque nem funcionaria (não existe a variável %userprofile%).
Gokuro disse: Se alguém souber como obter o diretório de um batch em execução compartilhe conosco por favor. Esse é um problema antigo que retomo p/Win Vista/7.
[]'s
Realmente até onde eu sei não há como fazer, mas por exemplo, se você tem um arquivo .bat (batch.bat) num diretório (C:\), e quer chamar outro .bat (chamado.bat) que está num diretório dentro desse diretório (C:\diretorio), você pode usar:
call /diretorio/chamado.bat
[]'s
Pedro Jotha disse: Desculpe, Fergo, mas vou ter que descordar com você. Programo batch desde o MS-DOS 5.0 passando por Win95, 98, Me, XP, e 7 e nunca tive que utilizar as tais aspas. Só se for coisa anterior ao MS-DOS 4.x, daí eu realmente não sei, mas não creio que ele vá usar esse arquivo num DOS 4.x ou inferior, até mesmo porque nem funcionaria (não existe a variável %userprofile%).
Se o caminho contém espaços você vai ter problemas se não colocá-lo entre áspas. O prompt só passou a ser "esperto" e entender o que é caminho e o que é argumento no XP se não me falha a memória. Win9x, DOS e o prompt do Win2k (se não me engano) vão tratar caminhos com espaços sem estar entre aspas como argumentos separados. Ex:
copy C:\Arquivos de Programas\teste.exe C:\teste.exe
As versões antigas vão entender que "C:\Arquivos", "de", "Programas\teste.exe" e "C:\teste.exe" são todos argumentos do copy, resultando em erro.
Se você colocar:
copy "C:\Arquivos de Programas\teste.exe" "C:\teste.exe"
Aí sim ele consegue identificar o caminho corretamente.
Gokuro disse:
Se alguém souber como obter o diretório de um batch em execução compartilhe conosco por favor. Esse é um problema antigo que retomo p/Win Vista/7.
É só usar o %0 com modificadores. Fica bem simples e direto. No seu caso, coloque modificador de drive e path: %~dp0
Por exemplo, para imprimir o diretório do batch em execução:
echo %~dp0
pause
Fergo
Ao Fergo
Informação preciosissima, Muito obrigado!
[]'s
P.S> Justa citação à colaboração:
http://code.google.com/p/jcm-br/issues/detail?id=2
Fergo disse: Se o caminho contém espaços você vai ter problemas se não colocá-lo entre áspas. O prompt só passou a ser "esperto" e entender o que é caminho e o que é argumento no XP se não me falha a memória. Win9x, DOS e o prompt do Win2k (se não me engano) vão tratar caminhos com espaços sem estar entre aspas como argumentos separados. Ex:
[code=rich]
copy C:\Arquivos de Programas\teste.exe C:\teste.exe
[/code]As versões antigas vão entender que "C:\Arquivos", "de", "Programas\teste.exe" e "C:\teste.exe" são todos argumentos do copy, resultando em erro.
Se você colocar:
[code=rich]
copy "C:\Arquivos de Programas\teste.exe" "C:\teste.exe"
[/code]Aí sim ele consegue identificar o caminho corretamente.
Pois é, mas na época do DOS e até o Win 3.11 não era permitido pasta com espaços. E depois disso, mesmo com o Win 95 permitindo LFN e SFN ainda era necessário usar pelo DOS o nome compacto de oito caracteres, pois o Win 95 rodava sobre um DOS sem suporte a LFN e SFN, logo, se usasse com as aspas como no exemplo que você deu ele iria dar erro. No caso, usando o mesmo exemplo, o correto ficaria:
[code=rich]copy C:\ARQUIV~1\teste.exe C:\teste.exe[/code]No Windows 98 nunca usei com aspas, mas também nunca usei pastas com espaço, sempre usei como o exemplo acima. Realmente não tenho como saber se funcionava sem as aspas.
No 2K ele já suporta nomes com espaços sem entender como argumento (ele usa o mesmo prompt que é usado no XP).
Muito obrigado pela informação do %~dp0!Eu procurei isso por décadas!
[]'s
Gokuro disse: Uso apenas Linux e não posso afirmar com certeza, mas experiemente usar o comando SET sem argumentos.
Referências:
Microsoft Windows XP - Command shell overview
Environment Variables in Windows XP
Se alguém souber como obter o diretório de um batch em execução compartilhe conosco por favor. Esse é um problema antigo que retomo p/Win Vista/7.
[]'s
Muitíssimo obrigado, me será de grande ajuda.