Como executar a comparação de cadeia curinga no arquivo de lote

3

Meu arquivo de lote grava uma lista de arquivos na tela onde ele contém a extensão .cs

for /F "usebackq delims=" %%A in ('cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"') do ( 
    if "%%~xA"==".cs"  echo %%A
)

Isso funciona bem. Eu quero melhorar a funcionalidade, adicionando outra condição. Eu quero remover uma determinada palavra, se existir na frase. A palavra é obj

Exemplos dos meus resultados são

myThing \ obj \ this.cs
obj \ other \ that \ this.cs
Depurar \ this \ that.cs

Eu tentei

for /F "usebackq delims=" %%A in ('cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"') do ( 
if "%%~xA"==".cs" if NOT "%%A"=="*obj*" echo %%A
)

mas isso não altera os resultados em comparação com o primeiro.

Acho que minha sintaxe if está correta, e o problema está na verdade com o "%%A"=="*obj*"

    
por MyDaftQuestions 31.01.2014 / 16:43

6 respostas

5

Você estava pensando corretamente: os curingas ( * ) não são suportados.

Uma boa solução para o problema é findstr , embora seja necessário recuperar o resultado via %ERRORLEVEL% e acho que você deve armazená-lo em cache por meio de outra variável (para que o próximo if não substitua seu valor):

echo %%A | findstr /C:"obj"
set obj_errorlevel=%errorlevel%

if "%%~xA"==".cs" if "%obj_errorlevel%"=="1" echo %%A

... mas isso é um caminho difícil.

Uma maneira ainda mais fácil é adicionar a condição ao comando de origem (o que está dentro de if ), adicionando outro estágio de pipe: ^| find /V "obj" :

for /F "usebackq delims=" %%A in ('cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->" ^| find /V "obj"')
    
por 31.01.2014 / 17:26
2

Acredito que sua edição esteja correta, pois você não pode usar curingas na comparação de string If. Na verdade, ele está procurando por *obj* , incluindo os asteriscos.

Talvez use FindStr em vez disso, canalizando todas as correspondências .cs por meio dele. Ele retorna um errorlevel de 0 se encontrado e 1 se não for encontrado.

Exemplo de código:

for /F "usebackq delims=" %%A in ('cleartool ls  -rec ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"') do ( 
  if "%%~xA"==".cs" echo %%A | findstr /C:"obj" 1>nul & if errorlevel 1 echo %%A
)
    
por 31.01.2014 / 17:30
1

Eu não acho que você pode usar 2 se é assim. Experimente:

for    xxxxxxx   (
   if first-condition (
       if second-condition (
         statement(s)
       )
   )
)
    
por 31.01.2014 / 16:54
1

Os asteriscos não são interpretados como curingas, portanto, a condição é avaliada como falsa. Em vez de uma segunda instrução if, você pode usar findstr para determinar se a variável contém o texto 'obj'. O comando define %errorlevel% para zero se uma correspondência for encontrada, para zero de outra forma.

Uma maneira conveniente de usar esse valor é através dos separadores de comandos condicionais && e || . Um comando anexado com || só será executado se o comando anterior tiver retornado um nível de erro diferente de zero, por exemplo:

(echo %%A | findstr /R .*obj.*)>NUL || 
  if "%%~xA"==".cs" echo %%A

A adição de >NUL é importante neste cenário. Sem suprimir a saída, tanto a primeira linha quanto a segunda linha poderiam imprimir a variável %%A . Para evitar confusão, você desejará que casos diferentes produzam resultados diferentes.

É claro que, se você já estiver usando findstr , você poderá se livrar completamente da declaração if e do corpo dela. A legibilidade não é ótima de qualquer maneira; o código abaixo é fornecido como uma alternativa.

(echo %%A|findstr /R /V ".*obj.*")|findstr /R /C:"\.cs $"
    
por 31.01.2014 / 18:10
0

Uma solução que pode funcionar para o que você deseja fazer. Isso usa a substituição de string de SET , conforme explicado no site Rob van der Woude .

@echo off
set _myvar=this\has\obj\in the string
echo Original: %_myvar%
::replace the string obj in _myvar
set _myvar=%_myvar:obj=%
::replace any double back-slashes in _myvar
set _myvar=%_myvar:\=\%
echo Withou obj: %_myvar%

_myvar originalmente contém a string 'obj'. A primeira vez que removemos a string usando a substituição de string do SET. Na segunda vez, removemos quaisquer barras duplas que possam ser deixadas devido à localização de 'obj'. Após os dois pontos, você tem a string que deseja procurar na variável. A string a substituir vem depois do sinal de igual antes do final da substituição.

Espero que ajude!

    
por 31.01.2014 / 18:38
0

Tente expandir o conteúdo de yourfile.cs e substitua a palavra ou a letra pelo caractere desejado por nada ou por algo. Aqui está a minha ideia.

Arraste o arquivo .cs sobre o ícone do arquivo de lote para abri-lo, para que .cs file seja param 1

@echo off

setlocal EnableDelayedExpansion


set /p a= enter letter to change:
set /p b= enter letter to change to:
set /p file=<%1

for /f %%c in ("!file:~!") do (
    set "code=!file:%a%=%b%!"
    echo !code!>myfile.cs
)

Altere myfile.cs para qualquer nome que você quiser

Por favor, melhore meus ans para melhores funções.

    
por 02.05.2014 / 23:24

Tags