Удаление двойных кавычек из переменных в пакетном файле создает проблемы со средой 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%
эхо.%Фамилия%
эхо.%ShipAddr%
отображать результаты в виде
"Susie Jo"
"Smith Barnes"
"123 E. Main St."
мне нужно устранить включенные цитаты по выбранным переменным. Например, FirstName и LastName используются в другом месте и не должны включать кавычки.
в тестовом пакетном файле мне удалось устранить кавычки, используя символ ~tilde в переменных.
> set FirstName=%~1
> set LastName=%~2
Я думал, что у меня есть решение, но вскоре я испытал необычное поведение с выполнением пакетных файлов. Вдруг ЦМД, не признавая заявления долгий путь. Нормальное выполнение пакетного файла из полного пути
> 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) я все еще в поисках a чистый и простой способ устранения кавычек из выбранных именованных переменных.
любая помощь для тех, кто более опытен, будет оценена по достоинству. Я здесь на пределе своих способностей... нужна помощь, пожалуйста!
edit 12/26/2009 13:36 PST
весь пакетный файл:
Blockquote
:: dataout.летучая мышь
:: редакция 12/25/2009 добавить ~Тильда для входящих % переменных, чтобы исключить встроенные " кавычки.
:: пишет список адресов с помощью параметры командной строки
:: записывает список вывода данных для qbooks IIF import
:: пишет данные торгового заказа для RUI
:: пример строки командной строки для тестирования
:: listmail[имя][фамилия]["адрес"]["города строку"][государство][зип][заказ#][PurchDate][Regname]["Имя Фамилия"][ИД транзакции][метод оплаты][сумма][Кодтовара][кол-во][Price_Each][PackPrep] [доставка] [CommissionPmt] [счет-фактура#]
:: пример: dataout Bellewinkle Moose " 123 Green Лесной путь ""Ванкувер" WA 98664 1004968 05/25/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "на счету" 20.67 FK-1P 1 8.95 3.00 1.39 239
@Эхо выключено
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
сдвиг
set ($TransactionID)=%~9
сдвиг
set ($PaymentMethod)=%~9
сдвиг
set ($Total)=%~9
сдвиг
set ($ProductIdentifier)=%~9
сдвиг
set ($Quantity)=%~9
сдвиг
set ($Price_Each)=%~9
сдвиг
set ($Pack_Prep)=%~9
сдвиг
set ($Shipping)=%~9
сдвиг
set ($ServiceFee)=%~9
сдвиг
set ($Discount)= % ~9
сдвиг
set ($Invoice)=%~9
сдвиг
set ($UnitPrice)=%~9
set _ShipCombName=%($FirstName)% %($LastName)%
комбинированное имя корабля echo - %_ShipCombName%
пауза
:: запись строковых переменных в лог-файл
Эхо ФН %($имя)% в %($фамилия)% БА %($BillingAddress1)% %($BillingCity)% %($BillingState)% %($BillingPostal)% %($номер заказа)% %($Purch_Date)% %($RegistrationName)% %($ИД транзакции)% %($метод оплаты)% %($общая)% %($ProductIdentifier)% %($количество)% %($Price_Each)% %($Pack_Prep)% %($Доставка)% %($ServiceFee)% %(скидка)% %($инвойс)% %($цена)% %_ShipCombName% >> d_out_log.txt
:: Назначить учетную запись поставщиком услуг
Если /я %($PaymentMethod)%= = набор дебиторской задолженности Amazon _QBAcct=Amazon.com
:: 12-25-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
Если /я %($PaymentMethod)%==on Account SET _QBAcct=%($RegistrationName)%
IF / i %($PaymentMethod)%==Mail SET _QBAcct=%($RegistrationName)%
IF / i %($PaymentMethod)%==AMER SET _QBAcct=Auth / Net
IF / i %($PaymentMethod)%= = набор дисков _QBAcct=Auth / Net
:: Назначить обозначение Rep на основе QBAccount
Если /я %($метод оплаты)%==Амазонки дебиторской задолженности, установить _Rep=Амазонка
:: 12-25-2009 добавлен второй метод Amazon pm'T для универсальности
Если /я %($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)%==on Account SET _Rep=R B
IF / i %($PaymentMethod)%==Mail SET _Rep=R B
IF / i %($PaymentMethod)%==AMER SET _Rep=BlueZap
Если /я %($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
Эхо-адрес файла написано
: ADDRFOUND
echo выбранный rep-это %_Rep%
выбранная учетная запись echo: %_QBAcct%
пауза
:: RUI OUT
: напишите заказу купца ID и id заказа Руи Руи
:: проверьте наличие дубликатов данных RUI в writeRUI.txt
компакт..
компакт-диск RegKOut
find / i "%($OrderNumber)%" writeRUI.txt
echo errorlevel: %errorlevel%
если errorlevel 1 goto : RUIWRITE
если errorlevel 0 goto :IIFWRITE
: RUIWRITE
echo %($Invoice)% %($OrderNumber)% >> writeRUI.txt
:: конец писать Руи
:: IIF OUT
:IIFWRITE
:: Проверьте наличие дубликатов данных счета в writeIIF.txt
find / i "%($OrderNumber)%" writeIIF.txt
echo errorlevel: %errorlevel%
если errorlevel 1 goto :HEADWRITE
если errorlevel 0 goto :LINEWRITE
: HEADWRITE
:: написать заголовок, Корабль/обработки, скидка, рэп и комиссии данные дь ИИФ импорт файла
echo %($OrderNumber)% %($Purch_Date)% счет-фактура %($TransactionID)% %_QBAcct% дебиторская задолженность %($Total)% %_Rep% >> writeIIF.txt
echo H / P %($Pack_Prep)% 1 ? > > writeIIF.txt
echo SHP %($Shipping)% 1 ? > > writeIIF.txt
echo DISC %($Discount)% 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)% %($Quantity)% ? > > writeIIF.txt
Гото: ЭОФ
: WRITE_DEFA
: пишет цены по умолчанию разбираются из данных продукта
echo %($ProductIdentifier)% %($UnitPrice)% %($Quantity)% ? > > writeIIF.txt
Гото: ЭОФ
:: 3-секундной задержкой
:: ТИП NUL | CHOICE.COM /N /CY / TY,3 >NUL
:ЭОФ
10 ответов:
у вас есть дополнительная двойная кавычка в конце, которая добавляет его обратно в конец строки (после удаления обеих кавычек из строки).
Input:
set widget="a very useful item" set widget set widget=%widget:"=% set widgetвыход:
widget="a very useful item" widget=a very useful itemПримечание: для замены двойных кавычек "одинарными кавычками" выполните следующие действия:
set widget=%widget:"='%Примечание: для замены слова " Мир " (без учета регистра) на BobB выполните следующие действия:
set widget="Hello World!" set widget=%widget:world=BobB% set widgetвыход:
widget="Hello BobB!"насколько ваш первоначальный вопрос (сохраните следующий код в пакетный файл .cmd или .летучая мышь и бежать):
@ECHO OFF ECHO %0 SET BathFileAndPath=%~0 ECHO %BathFileAndPath% ECHO "%BathFileAndPath%" ECHO %~0 ECHO %0 PAUSEвыход:
"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd "C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd "C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" Press any key to continue . . .
%0- это имя скрипта и путь к нему.%1это первый аргумент командной строки, и так далее.
ваш вывод (1) звучит не так. Здесь должен быть какой-то другой фактор.
проблема кавычек в параметрах пакетного файла обычно решается путем удаления кавычек с помощью
%~а затем положить их обратно вручную, где это необходимо.например:
set cmd=%~1 set params=%~2 %~3 "%cmd%" %params%обратите внимание на кавычки
%cmd%. Без них путь с пробелами не будет работать.Если бы вы могли опубликовать весь свой пакетный код, возможно, можно было бы дать более конкретный ответ.
потратил много времени, пытаясь сделать это простым способом. Внимательно посмотрев на цикл FOR, я понял, что могу сделать это только с одной строкой кода:
FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%Iпример:
@ECHO OFF SET Quoted="Test string" FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I ECHO %Quoted% ECHO %Unquoted%выход:
"Test string" Test string
обычно я просто удаляю все кавычки из своих переменных с помощью:
set var=%var:"=%а затем применить их снова там, где они мне нужны, например:
echo "%var%"
Это звучит как простая ошибка, где вы используете %~ где-то, где вы не должны быть. Использование, если %~ принципиально не меняет способ работы пакетных файлов, он просто удаляет кавычки из строки в этой единственной ситуации.
я узнал из этой ссылке, если вы используете XP или больше, что это будет просто работать само по себе:
SET params = %~1Я не мог получить каких-либо других решений здесь, чтобы работать на Windows 7.
перебрать их, я сделал это:
FOR %%A IN (%params%) DO ( ECHO %%A )Примечание: Вы получите только двойные кавычки, если вы передаете аргументы, разделенные пробелом, как правило.
- установить виджет="очень полезная вещь"
- установить виджет
- виджет= "очень полезный элемент"
- установить виджет=%виджет:"=%"
- установить виджет
- установить виджет=очень полезный пункт"
конечная цитата
"в строке 4 добавляется цитата"в строку. Он должен быть удален. Синтаксис строки 4 заканчивается на%
Я думал, что у меня есть решение, но вскоре я испытал необычное поведение с выполнением пакетных файлов. Вдруг ЦМД, не признавая заявления долгий путь. Нормальное выполнение пакетного файла из полного пути
C:\Documents и настройки\администратор\Мои Документы\Txt\batchtest\dataout.летучая мышь
возвращает
'C:\Documents' не распознается как внутренняя или внешняя команда....
вот и вся твоя проблема. CMD не понимает пробелы внутри имен файлов из командной строки, поэтому он думает, что вы пытаетесь передать
и настройки\администратор\Мои Документы\Txt\batchtest\dataout.летучая мышь
как параметры к
"C:\Documents"
@echo off Setlocal enabledelayedexpansion Set 1=%1 Set 1=!1:"=! Echo !1! Echo "!1!" Set 1=демонстрирует с кавычками или без них независимо от того, имеет ли исходный параметр кавычки или нет.
и если вы хотите проверить существование параметра, который может быть или не быть в кавычках, поместите эту строку перед эхом выше:
если '%1 '== " goto yoursub
но если проверка на наличие файла, который может или не может иметь кавычек, то это:
Если существует "!1!"goto othersub
обратите внимание на использование кавычек и двойные кавычки бывают разные.
все ответы полны. Но хотел добавить одну вещь,
установить FirstName=%~1
установить фамилию=%~2
эта линия должна была работать, вам нужно было небольшое изменение.
установить "FirstName=%~1"
установить "фамилия=%~2"
включить полное назначение в кавычки. Он будет удалять кавычки без проблем. Это предпочтительный способ назначения, который исправляет нежелательные проблемы с кавычками в аргументах.
Comments