Defina uma variável de caminho com espaços no caminho em um arquivo Windows .cmd ou arquivo em lote

112

Eu sou novo na escrita de roteiros e não consigo fazer este funcionar. Eu poderia, se movesse os arquivos para um caminho sem espaço, mas gostaria que funcionasse com o espaço, se pudesse.

Quero extrair várias atualizações do Office para uma pasta com um arquivo .cmd. Para tornar o arquivo em lote utilizável em qualquer computador, eu defino uma variável de caminho que só preciso alterar em um lugar para executá-la em outra máquina. O problema é que o caminho tem um espaço. Se eu colocar aspas ao redor do caminho na definição, cmd.exe os colocará ao redor do caminho antes de anexar o nome do arquivo e as opções e o lote falhará com "Erro de sintaxe da linha de comando". Sem as aspas, ele falha com "não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote."

Para teste, estou usando o botão de ajuda até ou se conseguir fazê-lo funcionar. Posso fazer isso usando um nome de arquivo / pasta 8.3 (por exemplo, Meus documentos como MeuDocu ~ 1), mas pode ser feito de outra maneira?

marcerickson
fonte
As aspas devem conter o caminho com o nome do arquivo e os parâmetros da linha de comando devem seguir. Você pode dar mais alguns detalhes sobre como a linha de comando é criada? Exatamente o que você quer dizer com> Se eu colocar aspas ao redor do caminho na definição, cmd.exe as colocará ao redor do caminho antes de anexar o nome do arquivo e as opções
vladhorby

Respostas:

104

Experimente algo assim:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2
aforia
fonte
Isso é o que eu fiz usando Replace no Notepad. Obrigado.
marcerickson
5
Ainda bem que ajudou. Seria bom se você votasse e aceitasse qualquer resposta que achar que o ajudou.
aphoria
75

eu uso

set "VAR_NAME=<String With Spaces>"

ao atualizar o caminho:

set "PATH=%UTIL_DIR%;%PATH%"
Koko
fonte
3
esta deve ser a resposta aceita. por alguma razão, chamar set de um bloco if não funciona se o valor tiver um espaço e não estiver entre aspas.
Kevin
33

Existem duas opções aqui. Primeiro, você pode armazenar o caminho sem aspas e apenas citá-lo mais tarde:

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

Outra opção que você pode usar é uma sub-rotina que permite remover aspas (mas, neste caso, não é uma ideia muito boa, já que você está adicionando aspas, removendo-as e adicionando-as novamente sem benefício):

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

O %~1remove as aspas em torno do argumento. Isso é útil ao passar nomes de pastas entre aspas, mas, como disse antes, neste caso particular não é a melhor ideia :-)

Joey
fonte
Usei o primeiro método, usando Replace in Notepad. O segundo parecia desnecessariamente complicado. Obrigado.
marcerickson
2
Eu tenho um arquivo em lote que obtém parâmetros. Usar set LALA=%~1foi o que funcionou para mim.
JCH2k
O segundo método funciona perfeitamente quando você está usando subrutinas
robe007
16

Experimente isso;

  1. crie uma variável como abaixo

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. Em seguida, substitua o caminho por variável. Certifique-se de adicionar aspas para início e fim

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    
Shiran Jayawardena
fonte
8

Sempre coloco o caminho entre aspas quando estou criando um arquivo .bat. (Acabei de adicionar PAUSE para que a tela não seja fechada.)

Por exemplo:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE
JoBaxter
fonte
7

A maneira correta de fazer isso é:

@ECHO off
SET MY_PATH=M:\Dir\^
With Spaces\Sub Folder^
\Dir\Folder
:: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
CALL "%MY_PATH%\hello.bat"
pause
Djangofan
fonte
5

A maneira mais fácil de corrigir esse problema é colocar o nome da pasta entre aspas:

(cd\New Folder\...) --> (cd\"New Folder"\...)

Espera que isso ajude.

user5528279
fonte
2

Se você precisar armazenar o caminho permanente (o caminho não é alterado quando o cmd é reiniciado)

  1. Execute o Prompt de Comando como administrador (clique com o botão direito em cmd.exe e selecione Executar como administrador)

  2. Em cmd setx path "%path%;your new path" , digite

  3. Verifique se o caminho é percorrido corretamente digitando path e pressionando Enter

mpmpeiris
fonte
1
Acho que a questão não é sobre a variável PATH , mas sim sobre uma variável de caminho . O OP aparentemente deseja armazenar um determinado caminho em uma variável e usar o valor no script em lote.
Andriy M
1

também tente adicionar barras duplas, como isso funciona apenas para mim

definir dir = "C: \\ 1. Alguma pasta \\ Outra pasta \\ Só porque"

@echo em MKDIR% dir%

Meu Deus, depois de postar, eles removeram o segundo \ no meu post, então se você abrir meu comentário e ele mostrar três, você deve lê-los como dois ......

Erwin
fonte