Что я делаю неправильно в этом синтаксисе IF?

Мы устанавливаем несколько новых компьютеров в моей компании, и эти новые компьютеры поставлялись с Windows 10, а до этого мы использовали Windows 7. Первая проблема, с которой мы столкнулись, заключалась в том, что Windows 10 управляет принтерами, а не выбирает принтер по умолчанию. Я смог отключить его с помощью пакетного файла, который выполняется каждый раз, когда кто-то входит в систему, изменяя реестр.

reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v LegacyDefaultPrinterMode /t "REG_DWORD" /d "1" /f

Дело в том, что когда управление принтером было отключено, Windows назначила любой из принтеров по умолчанию, поэтому я отредактировал пакетный файл, чтобы установить локальный принтер, подключенный к USB001, по умолчанию.

wmic printer where portname="USB001" call setdefaultprinter

Однако некоторые компьютеры используют удаленный принтер, подключенный как локальный порт, используя имя удаленного компьютера как «\\ComputerName\SamsungM» (имя компьютера может измениться, но все принтеры заканчиваются на «SamsungM»). Затем я попытался изменить пакет еще раз. Теперь он должен назначить принтер USB001 по умолчанию, если он подключен, а если нет, назначить по умолчанию тот, где имя порта заканчивается как «samsungm», но пакет не работает...

set var=wmic printer get portname
%var% > portas.txt
if /I "%samsungm" == "portas.txt" equal (
wmic printer where "PortName like '%samsungm'" call setdefaultprinter
) else (
wmic printer where portname="USB001" call setdefaultprinter
)

Отдельные команды для установки принтера по умолчанию работают, что привело меня к мысли, что это должен быть синтаксис If, который я ошибаюсь. Кто-нибудь может мне помочь?

EDIT1: После некоторой помощи в комментариях я понял несколько ошибок... Может быть, это немного больше похоже на то, что я хочу сделать:

C:\set var=wmic printer get portname
C:\%var%
PortName
\\ses267827\samsungm
usb001
C:\%var% > ports.txt
C:\findstr /E /I ".samsungm" ports.txt
C:\if ERRORLEVEL 0 (wmic printer where "PortName like '%samsungm'" call setdefaultprinter) else (wmic printer where portname="USB001" call setdefaultprinter)

Но все равно не работает...

EDIT2: я только что понял, что это наоборот. Так должно быть

C:\set var=wmic printer get portname
C:\%var%
PortName
\\ses267827\samsungm
usb001
C:\%var% > ports.txt
C:\findstr /E /I "usb001" ports.txt
C:\if ERRORLEVEL 0 (wmic printer where portname="USB001" call setdefaultprinter) else (wmic printer where "PortName like '%%samsungm'" call setdefaultprinter)

Я проверю это через несколько минут.

EDIT3: Проведены тесты. Работал для USB-принтера, но не для SamsungM. Кажется, что ERRORLEVEL не меняется, когда findstr не находит usb001 в файле ports.txt.


person Orley Lima    schedule 06.03.2020    source источник
comment
Что такое %samsungm? Переменная с опечаткой или литеральная строка?. Что equal должен делать? Введите if /? и сравните синтаксис if со своим.   -  person Stephan    schedule 06.03.2020
comment
samsungm — это строка. Я только что читал /? и увидел, что это должен быть .samsungm, верно? Равенство должно искать равенство между .samsungm и содержимым внутри файла portas.txt...   -  person Orley Lima    schedule 06.03.2020
comment
Кроме того, почему вы сравниваете строку или переменную %samsungm с portas.txt.. Вы ожидали, что оператор if прочитает содержимое файла?   -  person Gerhard    schedule 06.03.2020
comment
Как вы думаете, что делает ==?   -  person Stephan    schedule 06.03.2020
comment
неважно, ты уже сказал это. Оператор if не знает, что portas.txt является файлом, который вы хотите прочитать, даже если бы он знал, он не может читать файлы. Вам действительно нужно сказать пакетному файлу, чтобы он читал из файла, а не использовал portas.txt в качестве буквальной строки.   -  person Gerhard    schedule 06.03.2020
comment
Неа :). Итак, пожалуйста, как выглядит ваш ожидаемый вывод от wmic printer get portname, чтобы я мог видеть, что вам нужно делать. Тогда мы сможем показать вам правильный путь.   -  person Gerhard    schedule 06.03.2020
comment
@Стефан, я не уверен насчет ==. Это заменяет необходимость equal?   -  person Orley Lima    schedule 06.03.2020
comment
wmic printer get portname возвращает: PortName \\ses267827\samsungm USB001 Каждый из них в отдельной строке   -  person Orley Lima    schedule 06.03.2020
comment
Нет необходимости в equal вообще. Я думаю, вы неправильно прочитали помощь.   -  person Gerhard    schedule 06.03.2020
comment
Если бы вы действительно читали справку по команде IF, вы бы обязательно увидели это: string1==string2 Specifies a true condition if the specified text string match. Синтаксис использования вполне буквален. IF [NOT] string1==string2 command   -  person Squashman    schedule 06.03.2020
comment
в любом случае, я предлагаю вам использовать цикл for и использовать findstr для поиска строки вместо передачи в файл. Если вам нужна реальная помощь с ответом на этот вопрос, я предлагаю вам отредактировать вопрос и показать фактический пример вашего вывода из wmic printer get portname /value, чтобы я мог использовать ваш вывод в качестве примера.   -  person Gerhard    schedule 06.03.2020
comment
Может быть, тогда мне следует использовать findstr? Я пробовал это некоторое время и анализировал %ERRORLEVEL%, но тоже не мог заставить его работать.   -  person Orley Lima    schedule 06.03.2020
comment
Хорошо, @GerhardBarnard. Сделаю!   -  person Orley Lima    schedule 06.03.2020
comment
попробуйте ... like '%%samsungm'" ... (анализатор командного файла требует, чтобы % удваивалось, чтобы он действовал как символ, а не как начало переменной)   -  person Stephan    schedule 06.03.2020


Ответы (1)


Вам не нужен временный файл. Вы можете напрямую фильтровать вывод команды:

wmic printer get portname | findstr /xi "USB001" >nul 2>&1
if %errorlevel% == 0 (
  wmic printer where portname="USB001" call setdefaultprinter
) else (
  wmic printer where "PortName like '%%samsungm'" call setdefaultprinter
)

или немного короче:

wmic printer get portname | findstr /xi "USB001" >nul 2>&1 && (
  wmic printer where portname="USB001" call setdefaultprinter
) || (      
  wmic printer where "PortName like '%%samsungm'" call setdefaultprinter
)

>nul 2>&1 перенаправляет весь вывод команды wmic на устройство NUL. Нам не нужен вывод, только уровень ошибки.

Основной проблемой вашей последней попытки был знак процента (используемый wmic в качестве подстановочного знака). Анализатор пакетных файлов просто удаляет его, так как считает, что это начало переменной, и не может найти второй, чтобы отметить конец имени переменной. Чтобы использовать литерал %, вы должны удвоить его (это называется «экранированием») (только в командном файле; вам не нужно делать это непосредственно в командной строке)

person Stephan    schedule 06.03.2020
comment
Ваш работал, когда принтер подключен через USB001, но он не делал правильный принтер по умолчанию, когда к USB ничего не было подключено. Он вернул Нет доступных экземпляров. - person Orley Lima; 06.03.2020
comment
В вашем вопросе говорится, что если есть *samsungm, то сделайте его принтером по умолчанию, иначе сделайте принтер USB001 принтером по умолчанию. Когда нет USB001, как найти нужный принтер? - person Stephan; 06.03.2020
comment
О Боже. Это назад. Следует сказать, что если есть USB001, то сделайте его принтером по умолчанию, иначе сделайте *samsungm принтером по умолчанию. Я отредактирую исходный пост. - person Orley Lima; 06.03.2020
comment
адаптировал мой ответ (легко, так как логика остается прежней) - person Stephan; 07.03.2020
comment
То же самое все еще происходит. На одном принтере работает, на другом нет. - person Orley Lima; 07.03.2020