3

Мой пакетный файл пишет список файлов на экране, где он содержит расширение .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
)

Это отлично работает. Я хочу улучшить функциональность, добавив еще одно условие. Я хочу удалить определенное слово, если оно существует в фразе. Слово obj

Примеры моих результатов:

myThing\ OBJ \ this.cs
OBJ \ другое \ что \ this.cs
отлаживать \ этой \ that.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" if NOT "%%A"=="*obj*" echo %%A
)

но это не меняет результаты по сравнению с первым.

Я думаю, что мой синтаксис if правильный, и проблема на самом деле с "%%A"=="*obj*"

6 ответов6

6

Вы думали правильно: подстановочные знаки (*) не поддерживаются.

Хороший обходной путь для этой проблемы - findstr , хотя вам нужно получить результат через %ERRORLEVEL% и я думаю, что вы должны кешировать его через другую переменную (так что next, if не переопределяет его значение):

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

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

... но это трудный путь.

Еще более простой способ - добавить условие к исходной команде (внутри, if), добавив еще один этап конвейера: ^| 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"`)
2

Я считаю, что ваше редактирование правильное, поскольку вы не можете использовать подстановочные знаки в сравнении строк If. Это на самом деле ищет *obj* , включая звездочки.

Возможно, вместо этого используйте FindStr , пропуская через него любые .cs совпадения. Возвращает уровень ошибки 0, если найден, и 1, если не найден.

Пример кода:

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
)
1

Я не думаю, что вы можете использовать 2, если это так. Пытаться:

for    xxxxxxx   (
   if first-condition (
       if second-condition (
         statement(s)
       )
   )
)
1

Звездочки не интерпретируются как символы подстановки, поэтому условие оценивается как ложное. Вместо второго оператора if вы можете использовать findstr чтобы определить, содержит ли переменная текст obj. Команда устанавливает %errorlevel% на ноль, если совпадение было найдено, на ноль в противном случае.

Удобный способ использования этого значения - через условные разделители команд && и || , Команда, добавленная с || будет выполняться, только если предыдущая команда вернула ненулевой уровень ошибки, например:

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

Добавление >NUL важно в этом сценарии. Не подавляя вывод, как первая строка, так и вторая строка могут печатать переменную %%A Чтобы избежать путаницы, вам нужно, чтобы разные случаи давали разные результаты.

Конечно, если вы уже используете findstr , вы можете полностью избавиться от оператора if и его тела. Читаемость не так хороша в любом случае; код ниже предоставляется в качестве альтернативы.

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

Попробуйте расширить содержимое yourfile.cs и замените слово или букву нужным символом, либо ничем, либо чем-то. Вот моя идея

Перетащите файл .cs поверх значка пакетного файла, чтобы открыть его, чтобы файл .cs имел значение 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
)

Измените myfile.cs на любое имя

Пожалуйста, улучшите мои ответы для улучшения функций.

0

Решение, которое может работать для того, что вы хотите сделать. Это использует подстановку строк SET , как объяснено на сайте Роба ван дер Вуде .

@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 изначально содержит строку 'obj'. В первый раз мы удаляем строку, используя подстановку строки SET. Во второй раз мы удаляем любые двойные косые черты, которые могут остаться из-за расположения obj. После двоеточия у вас есть строка, которую вы хотите найти в переменной. Строка для замены следует после знака равенства перед концом замещения.

Надеюсь, это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .