Что я ошибаюсь в этом синтаксисе IF? - PullRequest
0 голосов
/ 06 марта 2020

Мы устанавливали несколько новых компьютеров в моей компании, и эти новые компьютеры поставлялись с 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)

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

РЕДАКТИРОВАТЬ 2: Я только что понял, что это назад. Это должно быть

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.

1 Ответ

0 голосов
/ 06 марта 2020

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

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 в качестве подстановочного знака). Парсер Batch-файлов просто удаляет его, потому что считает, что это начало переменной, и не может найти второй, чтобы отметить конец имени переменной. Чтобы использовать литерал %, вы должны удвоить его (это называется «экранирование») (только внутри пакетного файла; вам не нужно делать это непосредственно в командной строке)

...