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