Gostaria de acrescentar um comentário às soluções acima:
Todas essas sintaxes funcionam perfeitamente bem se o seu comando for encontrado no caminho ou se o comando for um cmdpath SEM ESPAÇOS OU PERSONAGENS ESPECIAIS.
Mas, se você tentar usar um comando executável localizado em uma pasta cujo caminho contenha caracteres especiais, será necessário colocar o caminho do comando entre aspas duplas (") e a sintaxe FOR / F não funcionará.
Exemplos:
$ for /f "tokens=* USEBACKQ" %f in (
`""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" Hello '"F:\GLW7\Distrib\System\Shells and scripting"'`
) do echo %f
The filename, directory name, or volume label syntax is incorrect.
ou
$ for /f "tokens=* USEBACKQ" %f in (
`"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'F:\GLW7\Distrib\System\Shells' is not recognized as an internal or external command, operable program or batch file.
ou
`$ for /f "tokens=* USEBACKQ" %f in (
`""F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello World" "F:\GLW7\Distrib\System\Shells and scripting"`
) do echo %f
'"F:\GLW7\Distrib\System\Shells and scripting\f2ko.de\folderbrowse.exe"" "Hello' is not recognized as an internal or external command, operable program or batch file.
Nesse caso, a única solução que encontrei para usar um comando e armazenar seu resultado em uma variável é definir (temporariamente) o diretório padrão como o próprio comando:
pushd "%~d0%~p0"
FOR /F "tokens=* USEBACKQ" %%F IN (
`FOLDERBROWSE "Hello world!" "F:\GLW7\Distrib\System\Layouts (print,display...)"`
) DO (SET MyFolder=%%F)
popd
echo My selected folder: %MyFolder%
O resultado está correto:
My selected folder: F:\GLW7\Distrib\System\OS install, recovery, VM\
Press any key to continue . . .
Obviamente, no exemplo acima, presumo que meu script em lote esteja localizado na mesma pasta que a do meu comando executável, para que eu possa usar a sintaxe "% ~ d0% ~ p0". Se esse não for o seu caso, você precisará encontrar uma maneira de localizar o caminho do comando e alterar o diretório padrão para o caminho.
NB: Para quem se pergunta, o exemplo de comando usado aqui (para selecionar uma pasta) é FOLDERBROWSE.EXE. Encontrei-o no site f2ko.de ( http://f2ko.de/en/cmd.php ).
Se alguém tiver uma solução melhor para esse tipo de comando acessível por um caminho complexo, ficarei muito feliz em ouvi-lo.
Gilles