Может ли кто-нибудь помочь с эффективным и безопасным способом удаления кавычек из пакетных переменных?
Я написал командный файл, который успешно импортирует список параметров% 1,% 2,% 3 и т.д. и помещает их в именованные переменные. Некоторые из этих параметров содержат несколько слов и поэтому заключены в двойные кавычки.
> "Susie Jo" (%1)
> "Smith Barnes" (%2)
> "123 E. Main St." (%3)
Эти переменные% затем помещаются в именованные переменные:
> set FirstName=%1
> set LastName=%2
> set ShipAddr=%3
проверка переменных осуществляется эхом.
echo.% FirstName%
echo.% LastName%
echo.% ShipAddr%
результаты отображаются как
"Susie Jo"
"Smith Barnes"
"123 E. Main St."
Мне нужно удалить кавычки для выбранных переменных. Например, FirstName и LastName используются где-то еще и не должны содержать кавычек.
В тестовом командном файле мне удалось исключить кавычки с помощью символа ~ тильда в переменных.
> set FirstName=%~1
> set LastName=%~2
Я думал, что у меня есть решение, но вскоре я испытал необычное поведение при выполнении командных файлов. Внезапно CMD перестает распознавать состояния длинного пути. Нормальное выполнение командного файла с полного пути
> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat
возвращается
> 'C:\Documents' is not recognized as an internal or external command....
Таким образом, может показаться, что добавление символа ~ тильды к входящим переменным% 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) Моя «короткая и приятная» идея вставки ~ тильды во входящие переменные% 1% 2 (% ~ 1 и т. Д.), Похоже, повлияла на некоторые настройки и изменила то, как CMD перемещается по длинным путям.
2) Я все еще ищу чистый и простой способ убрать кавычки из выбранных именованных переменных.
Любая помощь для более опытных будет очень признательна. Я здесь на исходе ... нужен совет, пожалуйста!
отредактировать 26/12/2009 13:36 PST весь командный файл:
Blockquote
:: dataout.bat
:: редакция 12/25/2009 добавить ~ Тильда входящих% переменных ликвидировать встроенные « в кавычки.
:: записывает список адресов с использованием параметров командной строки
:: записи списка вывода данных для QBooks IIF импорта
:: записи Данные торгового заказа для RUI
:: образец строки командной строки для тестирования
:: listmail [имя] [фамилия] ["адресная строка"] ["городская строка"] [штат] [почтовый индекс] [Заказ №] [PurchDate] [Regname] ["FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Invoice #]
:: пример: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 25.05.2009 "Bellewinkle Moose" "Olive Oyl" 101738 "On Account" 20.67 FK-1P 1 8.95 3.00 1.39 239
@echo off
cls
c:
cd \
cd документы и настройки \ администратор \ мои документы \ txt \ batchtest
обработка эха% 1% 2
: VARISET
::Преобразование параметров командной строки% n в
набор строковых переменных ($ FirstName) =% ~ 1
набор ($ LastName) =% ~ 2
набор ($ BillingAddress1) =% ~ 3
набор ($ BillingCity) =% ~ 4
набор ($ BillingState) =% ~ 5
набор ($ BillingPostal) =% ~ 6
набор ($ OrderNumber) =% ~ 7
набор ($ Purch_Date) =% ~ 8
набор ($ RegistrationName) =% ~ 9
смен
($ TransactionID) =% ~ 9
смен
($ PaymentMethod) =% ~ 9
смен
($ Total) =% ~ 9
смен ($ ProductIdentifier) =% ~ 9
смен
($ Quantity) =% ~ 9
смен
($ Price_Each) =% ~ 9
смен
($ Pack_Prep) =% ~ 9
смен
($ Доставка) =% ~ 9
смен
($ ServiceFee) =% ~ 9
смен
($ Discount) =% ~ 9
смен
($ Invoice) =% ~ 9
набор смен ($ UnitPrice) =% ~ 9
набор _ShipCombName =% ($ FirstName)%% ($ LastName)%
имя комбо эхо-корабля% _ShipCombName%
pause
:: записать строковые переменные в файл журнала
echo FN% ($ FirstName)% LN% ($ LastName)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date)%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Quantity)%% ($ Price_Each) %% ($ Pack_Prep)%% ($ Shipping)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: Assign Account by Поставщик услуг
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 25.12.2009 добавлен второй метод Amazon pm't для универсальности
IF / i% ($ PaymentMethod)% == Amazon SET _QBAcct = Amazon.com
IF / i% ($ PaymentMethod)% == MAST SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == MasterCard SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == Visa SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == PayPal SET _QBAcct = PayPalPmts
IF / i% ($ PaymentMethod)% == В учетной записи SET _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == Mail SET _QBAcct =% ($ RegistrationName)%
IF / i% ( $ PaymentMethod)% == AMER SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth / Net
:: Назначить указатель Rep на основе QBAccount
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 25.12.2009 добавлен второй метод Amazon pm't для универсальности
IF / i% ($ PaymentMethod)% == Amazon SET _Rep = Amazon
IF / i% ($ PaymentMethod)% == MAST SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == MasterCard SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == Visa SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == PayPal SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == В аккаунте SET _Rep = RB
IF / i% ($ PaymentMethod)% == Mail SET _Rep = RB
IF / i% ($ PaymentMethod)% == AMER SET _Rep = BlueZap
IF / i % ($ PaymentMethod)% == DISC SET _Rep = BlueZap
:: проверить дублирующиеся данные адреса
findstr / i / s "% _ShipCombName%" addrlist.txt
echo errorlevel:% errorlevel%,
если errorlevel 1 goto: ADDRWRITE
if errorlevel 0 goto: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% >> addrlist.txt
echo% ($ BillingAddress1)% >> addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt
echo. >> addrlist.txt
echo Address File Written
: ADDRFOUND
echo selected rep is% _Rep%
echo selected account is:% _QBAcct%
pause
:: RUI OUT
:: записать идентификатор заказа продавца и идентификатор заказа RUI в RUI
:: проверить наличие дубликатов данных RUI в writeRUI.txt
cd ..
cd RegKOut
find / i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
if errorlevel 1 goto: RUIWRITE
if errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo% ($ Invoice)% % ($ OrderNumber)% >> writeRUI.txt
:: end write RUI
:: IIF OUT
: IIFWRITE
:: Проверить дублирующиеся данные счета в файле writeIIF.txt
find / i "% ($ OrderNumber)%" writeIIF.txt
echo errorlevel:% errorlevel%
if errorlevel 1 goto: HEADWRITE
if errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: write Заголовок, отгрузка / обработка, скидка, данные о репутации и комиссии в файл импорта QB IIF
echo% ($ OrderNumber)%% ($ Purch_Date)% Invoice% ($ TransactionID)%% _QBAcct% Accounts Receivable% ($ Total)%% _Rep % >> writeIIF.txt
echo H / P% ($ Pack_Prep)% 1? >> writeIIF.txt
echo SHP% ($ Доставка)% 1? >> writeIIF.txt
echo DISC% ($ скидка)% 1? >> writeIIF.txt
echo 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)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
: WRITE_DEFA
: записывает цены по умолчанию, полученные из данных о продукте
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
:: 3-секундная задержка
:: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF
источник
Ответы:
У вас есть дополнительная двойная кавычка в конце, которая добавляет ее обратно в конец строки (после удаления обеих кавычек из строки).
Входные данные:
Вывод:
Примечание. Чтобы заменить "двойные кавычки" на одинарные кавычки, выполните следующие действия:
Примечание. Чтобы заменить слово «World» (без учета регистра) на BobB, выполните следующие действия:
Вывод:
Что касается вашего первоначального вопроса (сохраните следующий код в командном файле .cmd или .bat и запустите):
Вывод:
%0
это имя и путь скрипта.%1
- это первый аргумент командной строки и так далее.источник
SET BathFileAndPath=%~0
(на самом деле, мой массив параметров начинается с 1, поэтому я использовалSET BathFileAndPath=%~1
%widget:"=%
избавляются от кавычек?:old=new
это сопоставление с образцом и замена в раскрытии переменной. При использовании"
as theold
и ничего как thenew
кавычки удаляются, даже если они находятся посередине, даже если они не сбалансированы.Ваш вывод (1) звучит неверно. Должен быть какой-то другой фактор.
Проблема кавычек в параметрах командного файла обычно решается удалением кавычек с
%~
и последующим их возвращением вручную, где это необходимо.Например:
Обратите внимание на кавычки вокруг
%cmd%
. Без них путь с пробелами работать не будет.Если бы вы могли опубликовать весь свой пакетный код, возможно, можно было бы дать более конкретный ответ.
источник
%~1
asExpands %1 and removes any surrounding quotation marks ("").
cmd
себя об этих модификаторах:call /?
для помощи по модификаторам параметров,set /?
для модификаторов переменных (вероятно, не очень интуитивно). Очень удобно.Обычно я просто удаляю все кавычки из своих переменных с помощью:
А затем примените их снова, где они мне нужны, например:
источник
:
как.
- после того, как разобрался, работал без сучка и задоринки. Отличный совет!Потратил много времени, пытаясь сделать это простым способом. Внимательно посмотрев на цикл FOR, я понял, что могу сделать это с помощью всего одной строчки кода:
Пример:
Вывод:
источник
Это похоже на простую ошибку, когда вы используете% ~ где-то там, где вам не следует находиться. Использование if% ~ принципиально не меняет способ работы командных файлов, оно просто удаляет кавычки из строки в этой единственной ситуации.
источник
Из этой ссылки я узнал , что если вы используете XP или выше, это просто сработает само по себе:
SET params = %~1
Я не мог заставить какие-либо другие решения работать в Windows 7.
Чтобы перебрать их, я сделал следующее:
Примечание. Вы получите двойные кавычки, только если вы передадите аргументы, разделенные пробелом.
источник
Завершающая кавычка
"
в строке 4 добавляет кавычку"
к строке. Его следует удалить. Синтаксис строки 4 заканчивается на%
источник
widget="a very useful item"
и прочтите строку 6, чтобы увидеть, что она отображается:widget=a very useful item"
и поймите, что строка 7 будет,set widget=%widget:"=%
а строка 8 будет замечать, что отображаемая строкаwidget=a very useful item
больше не имеет завершающей цитаты .В этом вся твоя проблема. CMD не понимает пробелов внутри имен файлов из командной строки, поэтому думает, что вы пытаетесь передать
в качестве параметров
программа.
Вам нужно процитировать его, чтобы запустить командный файл с пробелами в пути:
сработало бы.
источник
Демонстрирует с кавычками или без них, независимо от того, есть ли кавычки в исходном параметре.
И если вы хотите проверить наличие параметра, который может быть или не быть в кавычках, поместите эту строку перед эхом выше:
Если '% 1' == '' перейти к вашей подписке
Но если проверять наличие файла, который может содержать или не содержать кавычки, то это:
Если СУЩЕСТВУЕТ "! 1!" перейти к другому
Обратите внимание, что использование одинарных и двойных кавычек различается.
источник
Все ответы полные. Но хотел добавить одну вещь,
Эта строка должна была работать, вам нужно было небольшое изменение.
Включите полное задание в кавычки. Он удалит кавычки без проблем. Это предпочтительный способ назначения, который устраняет нежелательные проблемы с кавычками в аргументах.
источник
Простой синтаксис тильды работает только для удаления кавычек вокруг параметров командной строки, передаваемых в пакетные файлы.
Приведенный выше код пакетного файла установит xyz на любое значение, переданное в качестве первого параметра, удаляя начальные и конечные цитаты (если они есть).
Но этот простой синтаксис тильды не будет работать для других переменных, которые не были переданы в качестве параметров.
Для всех остальных переменных вам необходимо использовать расширенный синтаксис подстановки, который требует, чтобы вы указали ведущие и запаздывающие символы, которые необходимо удалить. Фактически мы даем указание удалить первый и последний символы, не глядя на то, что они есть на самом деле.
Если мы хотим проверить, что первый и последний символ были на самом деле цитатой, прежде чем удалять ее, нам понадобится дополнительный код, как показано ниже.
источник