Как использовать ” (кавычки) в качестве разделителя for /f в cmd.exe в windows 7
обычно опционы заключаются в кавычки. Если вы хотите использовать цитату как часть опциона, то заключительные кавычки должны быть отброшены. Это означает, что все символы, которые интерпретатор CMD использует в качестве разделителей маркеров, должны быть экранированы, включая пробел и знак равенства. Также цитата должна быть экранирована.
for /f tokens^=2^ delims^=^" %%F in ...
этот же метод используется для решения другой распространенной проблемы – как использовать FOR /F и сохранить всю строку, независимо от того, какой символ начинается с данной строки. Тот проблема-параметр EOL (по умолчанию точка с запятой). Чтобы гарантировать сохранение всей линии, EOL должен быть отключен. Здесь снова закрывающие кавычки отбрасываются и разделители маркеров должны быть экранированы.
for /f delims^=^ eol^= %%F in ....
DELIMS имеет значение nothing, поскольку пробел никогда не включается в параметр DELIMS, если не указан последний параметр. Следующий строковый символ после EOL=
принимается за символ EOL. Но в этом случае не существует следующего символа, потому что пробел не ускользнул и не процитирован. Так что выше синтаксис отключает DELIMS и Эол.
Удаление двойных кавычек из переменных в пакетном файле создает проблемы со средой cmd
может ли кто-нибудь помочь с эффективным и безопасным способом удаления кавычек из пакетных переменных?
Я написал пакетный файл, который успешно импортирует список параметров %1, %2, %3 и т. д. и помещает их в именованные переменные. Некоторые из этих параметров содержат несколько слов и заключены в двойные кавычки.
> "Susie Jo" (%1)
> "Smith Barnes" (%2)
> "123 E. Main St." (%3)
эти % переменные затем помещаются в именованные переменные:
> set FirstName=%1
> set LastName=%2
> set ShipAddr=%3
проверка переменных осуществляется эхо.
Эхо.%FirstName%
эхо.%LastName%
эхо.%ShipAddr%
отображать результаты в виде
"Susie Jo"
"Smith Barnes"
"123 E. Main St."
мне нужно устранить включенные цитаты по выбранным переменным. Например, FirstName и LastName используются в другом месте и не должны включать кавычки.
в тестовом пакетном файле мне удалось исключить кавычки, используя символ ~tilde в переменных.
> set FirstName=%~1
> set LastName=%~2
Я думал, что у меня есть решение, но вскоре я испытал необычное поведение с выполнением пакетных файлов. Внезапно CMD не распознает состояния длинного пути. Нормальное выполнение пакетного файла с полного пути
> C:Documents and SettingsAdministratorMy DocumentsTxtbatchtestdataout.bat
возвращает
> 'C:Documents' is not recognized as an internal or external command....
таким образом, кажется, что добавление символа ~tilde к входящему %1% 2…%n переменных вызвало некоторые изменения. Возможно, некоторые переменные среды были изменены?
Я также попытался очистить кавычки из переменной с помощью различные попытки использования команды FOR. Это кажется неудобным, и я не смог узнать, как это сделать, создав список переменных для выполнения задачи:
что-то вроде этого:
for %%g in (%FirstName% %LastName%) do (
set %%g=%%~g
set %%h=%%~h
set FirstName=%%~g
set LastName=%%h
echo.%FirstName% %LastName%
)
Я думаю, что у меня есть два вопроса.
1) моя “короткая и сладкая” идея вставки ~tilde во входящие переменные %1 %2 (%~1 и т. д.), похоже, повлияла на некоторые настройки и изменила способ навигации CMD по длинным путям.
2) я все еще в поисках чистый и простой способ устранения кавычек из выбранных именованных переменных.
любая помощь для тех, кто более опытен, будет наиболее оценена. Мои навыки здесь на исходе… нужна помощь, пожалуйста!
редактировать 12/26/2009 13:36 PST
весь пакетный файл:
Blockquote
:: dataout.летучая мышь!–17–>
:: revision 12/25/2009 добавьте ~tilde к входящим переменным%, чтобы исключить встроенные кавычки.
:: записывает список адресов с помощью параметры командной строки
:: записывает список вывода данных для импорта QBooks IIF
:: пишет данные торгового заказа для RUI
:: пример строки командной строки для тестирования
:: listmail[имя][фамилия][“адрес”][“города строку”][государство][зип][заказ#][PurchDate][Regname][“Имя Фамилия”][ИД транзакции][метод оплаты][сумма][Кодтовара][кол-во][Price_Each][PackPrep] [доставка] [CommissionPmt] [счет-фактура#]:: пример: dataout Bellewinkle Moose ” 123 Green Forest Way “”Vancouver” WA 98664 1004968 05/25/2009 “Bellewinkle Moose” “Olive Oyl” 101738 “на счету” 20.67 FK-1P 1 8.95 3.00 1.39 239
@echo off
cls
c:
компакт-диск
cd документы и настройкиадминистраторМои документыtxtbatchtest
обработка Эха %1 %2
: ВАРИСЕТ
:: Преобразование % n параметров командной строки в строковые переменные
set ($FirstName)=%~1
set ($LastName)=%~2
набор ($BillingAddress1)=%~3
set ($BillingCity)=%~4
set ($BillingState)=%~5
set ($BillingPostal)=%~6
set ($OrderNumber)=%~7
set ($Purch_Date)=%~8
set ($RegistrationName)=%~9
shift
set ($TransactionID)=%~9
shift
set ($PaymentMethod)=%~9
shift
set ($Total)=%~9
сдвиг
set ($ProductIdentifier)=%~9
shift
set ($Quantity)=%~9
shift
set ($Price_Each)=%~9
shift
set ($Pack_Prep)=%~9
shift
набор ($доставка)=%~9
shift
set ($ServiceFee)=%~9
shift
набор (скидка)=%~9
shift
set ($Invoice)=%~9
shift
set ($UnitPrice)=%~9
set _ShipCombName=%($FirstName)% %($LastName)%
комбо-имя корабля echo – %_ShipCombName%
пауза
:: запись строки varibables в logfile
Эхо ФН %($имя)% в %($фамилия)% БА %($BillingAddress1)% %($BillingCity)% %($BillingState)% %($BillingPostal)% %($номер заказа)% %($Purch_Date)% %($RegistrationName)% %($ИД транзакции)% %($метод оплаты)% %($общая)% %($ProductIdentifier)% %($количество)% %($Price_Each)% %($Pack_Prep)% %($Доставка)% %($ServiceFee)% %(скидка)% %($инвойс)% %($цена)% %_ShipCombName% >> d_out_log.txt
:: Назначить учетную запись поставщиком услуг
IF / i %($PaymentMethod)%==набор дебиторской задолженности Amazon _QBAcct=Amazon.com
:: 12-25-2009 добавлен второй метод Amazon pm’T для универсальности
IF / i %($PaymentMethod)%==набор Amazon _QBAcct=Amazon.com
Если /i %($PaymentMethod)%==MAST SET _QBAcct=Auth/Net
Если / i %($PaymentMethod)%==MasterCard SET _QBAcct=Auth/Net
Если / i %($PaymentMethod)%==Visa SET _QBAcct=Auth/Net
Если / i %($PaymentMethod)%==PayPal SET _QBAcct=PayPalPmts
IF / i %($PaymentMethod)%==на счете установлено _QBAcct=%($RegistrationName)%
Если / i %($PaymentMethod)%==почтовый набор _QBAcct=%($RegistrationName)%
Если /i %($PaymentMethod)%==Amer SET _QBAcct=Auth/Net
Если / i %($PaymentMethod)%==набор дисков _QBAcct=Auth/Net
:: Назначить обозначение Rep на основе QBAccount
Если / i %($PaymentMethod)%==Amazon дебиторская задолженность SET _Rep=Amazon
:: 12-25-2009 добавлен второй метод Amazon pm’T для универсальности
IF / i %($PaymentMethod)%==Amazon SET _Rep=Amazon
Если / i %($PaymentMethod)%==набор мачт _Rep=BlueZap
Если / i %($PaymentMethod)%==MasterCard SET _Rep=BlueZap
Если / i %($PaymentMethod)%==Visa SET _Rep=BlueZap
Если / i %($PaymentMethod)%==PayPal SET _Rep=BlueZap
Если / i %($PaymentMethod)%==на счете SET _Rep=R B
Если / i %($PaymentMethod)%==почтовый набор _Rep=R B
Если / i %($PaymentMethod)%==Amer SET _Rep=BlueZap
IF / i %($PaymentMethod)%==набор дисков _Rep=BlueZap
:: проверьте наличие дубликатов адресных данных
findstr /i / s “%_ShipCombName%” addrlist.txt
echo errorlevel: %errorlevel%
если errorlevel 1 goto: ADDRWRITE
если errorlevel 0 goto :ADDRFOUND
: ADDRWRITE
echo %_ShipCombName% >> addrlist.txt
echo %($BillingAddress1)% >> addrlist.txt
echo %($BillingCity)% %($BillingState)% %($BillingPostal)% >> addrlist.txt
эхо. >> addrlist.txt
echo адрес файла написано
: ADDRFOUND
Echo выбранный rep – %_Rep%
выбранная учетная запись echo: %_QBAcct%
пауза
:: RUI OUT
: напишите заказу купца ID и id заказа Руи Руи
:: проверьте наличие дубликатов данных RUI в writeRUI.txt
компакт..
компакт-диск RegKOut
найти / i “%($OrderNumber)%” writeRUI.txt
echo errorlevel: %errorlevel%
если значение errorlevel 1 Гото : RUIWRITE
если errorlevel 0 goto :IIFWRITE
: RUIWRITE
echo %($Invoice)% %($OrderNumber)% >> writeRUI.txt
:: конец писать RUI
:: IIF OUT
:IIFWRITE
:: Проверьте наличие дубликатов данных накладной в writeIIF.txt
найти /i” %($OrderNumber)% ” writeIIF.txt
echo errorlevel: %errorlevel%
если errorlevel 1 goto: HEADWRITE
если errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: написать заголовок, Доставка / обработка, скидка, Rep и комиссионные данные в файл импорта QB IIF
echo %($OrderNumber)% %($Purch_Date)% счет-фактура %($TransactionID)% %_QBAcct% дебиторская задолженность %($Total)% %_Rep% >> writeIIF.txt
echo H / P %($Pack_Prep)% 1 ? > > writeIIF.txt
echo SHP %($доставка)% 1 ? > > writeIIF.txt
диск echo %(скидка$)% 1 ? > > writeIIF.txt
эхо Comm %($ServiceFee)% 1 ? > > writeIIF.txt
: LINEWRITE
IF / i %($ProductIdentifier)% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
echo %($ProductIdentifier)%
:WRITE_DISC
:: пишет цены со скидкой, проанализированные из пользовательской переменной:
echo %($ProductIdentifier)% %($Price_Each)% %($количество)% ? > > writeIIF.txt
Гото :ВФ
:WRITE_DEFA
: записывает цены по умолчанию из данных продукта
echo %($ProductIdentifier)% %($UnitPrice)% %($количество)% ? > > writeIIF.txt
Гото :ВФ
:: 3-секундной задержкой
:: ТИП NUL | CHOICE.COM /N /CY / TY,3 >NUL
: EOF
Экранирование двойных кавычек в командной строке ms dos?
Имеется некое приложение командной строки (кто знает cryptcp). Этому приложению передается большое количество параметров. Один из параметров заключен в двойные кавычки. И внутри этого параметра есть значение также содержащее двойные кавычки (обратите внимание на значение параметра -dn – он как раз в двойных кавычках, а в самом значении есть O=ООО “Тестовая организация”)
cryptcp -creatrqst p20.der -provtype 75 -cont Petrov20 -dn “T=Руководитель,OID.1.2.840.113549.1.9.2=INN=0123456789/KPP=123456789/OGRN=0123456789123,CN=Петров Петр Петрович,OU=Тестовое подразделение,O=ООО “Тестовая организация”,L=Краснодар,S=23 Краснодарский край,C=RU,E=test@test.ru,ИНН=001234567890,ОГРН=0123456789123,СНИЛС=12345678901″ -certusage “1.2.643.1.1,1.2.643.1.2,1.2.643.1.3.1,1.2.643.1.4.5,1.2.643.1.5,1.2.643.1.6” -both -ku -provname “Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider”
Что уже попробовал:
-обрамление значения в ‘ или ` вместо двойных кавычек;
-экранирование двойных кавычек в O=ООО “Тестовая организация” символами , ^;
– замену O=ООО “Тестовая организация” на O=ООО “”Тестовая организация””;
– замену ” на x22 или x22 или ^x22;
– замену пробелов в значении на , чтобы все значение не заключать в двойные кавычки.
Прошу подсказать еще варианты.
Спасибо