Como posso fazer o prompt de comando do windows retornar uma subcadeia de uma ordem de comando?

0

Meu caminho está apontado para uma pasta na nuvem (localizada em vários locais em meus vários dispositivos) em que armazenei um arquivo em lote que deveria se localizar na máquina e, então, transforme esse diretório no novo diretório de trabalho dessa sessão. .

Localizando o arquivo

@echo off Sem confusão

cls limpar ardósia

Echo Searching porque às vezes demora um pouco

dir /b /s myScripts.bat E isso gera o diretório completo, incluindo o nome do arquivo.

Então, meu primeiro problema é me livrar do nome do arquivo. Isso é o que eu tentei:

set stringOne=dir /b /s myScripts.bat

%stringOne:~0, 60%

Eu encontrei um script para contar o comprimento de uma string que usarei para deduzir automaticamente esses valores mais tarde, se eu realmente precisar deles.

O problema é que eu descobri que se eu diminuir esse número para 10, o comando dir é encurtado da seguinte forma:

dir c:\users\myUsername\cloudDrive\scripts , ou qualquer que seja o caso, e, em vez disso, o cmd insere dir c:\users\m e pesquisa tudo isso de forma recursiva.

Mais uma vez, o que eu gostaria de fazer é mostrar uma versão modificada do diretório pesquisado, NÃO modificar o comando de pesquisa de diretório. Mais tarde, usarei a sequência final produzida para definir meu diretório de trabalho, mas estou tentando dar um passo de cada vez, para entender o que está acontecendo.

EDITAR: O objetivo final do SCRIPT é diferente do meu propósito de escrevê-lo. Quando tudo estiver dito e feito, eu deveria ser capaz de digitar myScripts.bat em cmd, em qualquer computador que eu tenha anexado à sua pasta PATH my cloud, e ele irá obter o diretório dessa pasta na nuvem por meio do comando dir, e em seguida, altere seu diretório de trabalho para o arquivo em lote.

    
por Musixauce3000 20.11.2015 / 20:26

2 respostas

1

Para responder a esta parte:

And this outputs the full directory, including the file name. So my first problem is getting rid of the file name.

Em um arquivo de lote, você pode fazer

@echo off

:: locate 'myScripts.bat' and save its directory to 'myDir'
:: in case of multiple matches 'myDir' will be set to the last one
set "myDir="
for /f "delims=" %%x in ('dir /b /s myScripts.bat') do set "myDir=%%~dpx"
if not defined myDir echo not found ?? & exit /b 1

:: ready to use
echo myDir = "%myDir%"

Para obter uma melhor visualização dos arquivos em lote, recomendo que você leia a ajuda interna, começando com set /? , if /? , for /? , call /? .

[EDIT] Adicionada "delims=" para manipular caminhos com espaços corretamente.

    
por 21.11.2015 / 03:44
0

Digamos que você crie um arquivo de lote chamado test.cmd e coloque o seguinte texto nele, a saída será a seguinte:

@echo off
echo %0
echo %cd%

set currentpath=%0

::remove any " if present
set currentpath=%currentpath:"=%

:: remove last 9 characters
set currentpath=%currentpath:~0,-9%

:: add quotes back
set currentpath="%currentpath%"

echo %currentpath%

pause

e a saída será se:

                C:\Windows\System32>%appdata%\..\..\desktop\test.cmd
%0:             C:\Users\LPChip\AppData\Roaming\..\..\desktop\test.cmd
%cd%:           C:\Windows\System32
%currentpath%:  "C:\Users\LPChip\AppData\Roaming\..\..\desktop"
                Press any key to continue . . .

O primeiro comando usa uma função de substituição. O ~ operador significa, substituição de substring, adicionando 0, a nova string começa na posição 0, o -9 significa, para 9 posições a partir da direita.

É claro que a maneira mais rápida e fácil ainda está usando% cd% para obter o diretório atual, mas como você deseja encontrar o caminho atual de onde o batchfile reside, o outro método faz exatamente isso.

Um ótimo recurso para aprender mais sobre a manipulação de strings é este site: dostips.com

    
por 21.11.2015 / 16:09