В пакетном скрипте мне нужно перенаправить поток скрипта в соответствии с тем, соответствует ли одна переменная началу другой. В частности, я хочу сделать что-то вроде этого:

IF %CD% BEGINSWITH %USERPROFILE% (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

Мне было трудно найти что-то для решения этой проблемы в Интернете, или, по крайней мере, что-то, что имеет для меня смысл. Если это выполнимо, пожалуйста, продемонстрируйте, как и почему функционирует работоспособное решение.

2 ответа2

1

Ответ иззи часто будет работать, но он может дать неправильный результат при многих обстоятельствах.

  • Поиск FINDSTR может не соответствовать должным образом, если есть разница в регистре. Решается с помощью параметра /I

  • FINDSTR будет обрабатывать строку поиска как две или более строк поиска, если имя профиля содержит пробел. Лучше использовать параметр /C:"searchString" .

  • FINDSTR выполнит поиск по регулярному выражению, если %USERPROFILE% включает метасимвол, подобный регулярному выражению . , Эту проблему можно решить путем принудительного литерального поиска с помощью параметра /L или параметра /C:"searchString" .

  • Обратная косая черта может быть немного сложнее с FINDSTR, так как она используется FINDSTR как escape-символ. Безопаснее избежать всех обратных слешей как \\ .

  • Команда ECHO может не работать, если текущее имя каталога содержит специальный символ, такой как & . Команда CD безопасно напечатает текущий каталог, не беспокоясь о специальных символах.

Кроме того, поскольку FINDSTR используется в качестве теста, и нет никакой заинтересованности в просмотре совпадающей строки, вывод должен быть перенаправлен в NUL.

И, наконец, решение можно упростить, заменив оператор IF условными && и || операторы.

Следующий код должен всегда работать:

cd|findstr /bic:"%userprofile:\=\\%" >nul&&echo You can do stuff here!||echo You don't belong here!

Обновление - пример изменения регистра букв

Вот сеанс Windows 7 cmd.exe, который демонстрирует, как может варьироваться регистр буквы диска, сообщаемый CD (или %CD%):

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>set userprofile
USERPROFILE=C:\Users\Dave

C:\>cd c:\users\Dave

c:\Users\Dave>cd
c:\Users\Dave

c:\Users\Dave>echo CD=%CD%
CD=c:\Users\Dave

c:\Users\Dave>cd..

c:\Users>cd C:\users\Dave

C:\Users\Dave>cd
C:\Users\Dave

C:\Users\Dave>echo CD=%CD%
CD=C:\Users\Dave

C:\Users\Dave>
0

В итоге я понял это сам. Я не совсем уверен, почему я не заметил это решение где-либо еще.

ECHO %CD%|FINDSTR /B "%USERPROFILE%"
IF %ERRORLEVEL% EQU 0 (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

Обычно FINDSTR ищет строки в данном текстовом файле. Однако он также может принимать входные данные из конвейера. Здесь мы используем ECHO чтобы поместить текущий каталог (%CD%) в конвейер, а затем сказать FINDSTR искать папку профиля пользователя ("%USERPROFILE%" - обязательные кавычки) в начале (/B) переданных данных ,

Так как FINDSTR возвращает ERRORLEVEL , мы можем проверить это с помощью более позднего оператора IF и затем действовать соответствующим образом.

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