Удаление двойных кавычек из переменных в пакетном файле создает проблемы с средой 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%
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) Я все еще ищу чистый и простой способ исключить цитаты из выбранных переменных.
Любая помощь для более опытных людей будет оценена по достоинству. Я в конце своих навыков здесь... нужно некоторое руководство, пожалуйста!
edit 12/26/2009 13:36 PST
весь пакетный файл:
Blockquote
:: dataout.bat
:: revision 12/25/2009 добавить ~ тильда к входящим% переменным, чтобы исключить встроенные "кавычки.
:: запись списка адресов с использованием параметров командной строки
:: записывает список выходных данных для импорта QBooks IIF
:: данные Merchant Order для RUI
:: пример строки командной строки для тестирования
:: listmail [firstname] [lastname] [" address string "] [" city string "] [state] [zip] [Order #] [PurchaseDate] [Regname] [" FirstName LastName "] [TransactionID] [PaymentMethod] [ Всего] [ProductID] [Кол-во] [Price_Each] [PackPrep] [Доставка] [КомиссияPmt] [Счет-фактура #]
:: пример: dataout Bellewinkle Moose" 123 Green Forest Way "" Ванкувер "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
ЦБС
с:
кд\
cd документы и настройки\administrator\мои документы \txt\batchtest
обработка эха% 1% 2
: VARISET
:: Преобразование параметров командной строки% n в строковые переменные
set ($ FirstName) =% ~ 1
set ($ LastName) =% ~ 2
set ($ BillingAddress1) =% ~ 3
set ($ BillingCity) =% ~ 4
set ($ BillingState) =% ~ 5
set ($ BillingPostal) =% ~ 6
set ($ OrderNumber) =% ~ 7
set ($ Purchase_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 ship% _ShipCombName%
пауза
:: написать строку varibables в logfile
echo FN% ($ FirstName)% LN% ($ LastName)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purchase_Date )%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Количество)%% ($ Price_Each)%% ($ Pack_Prep)% % ($ Shipping)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% → d_out_log.txt
:: Назначить учетную запись поставщиком услуг
IF/i% ($ PaymentMethod)% == Амазонка Дебиторская задолженность SET _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
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)% == Амазонка дебиторская задолженность SET _Rep = Amazon
:: 12-25-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 = R B
IF/i% ($ PaymentMethod)% == Mail SET _Rep = R B
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
если errorlevel 0 goto: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% → addrlist.txt
echo% ($ BillingAddress1)% → addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% → addrlist.txt
эхо. → addrlist.txt
эхо файл адреса, написанный
: ADDRFOUND
эхо выбранная репутация% _Rep%
Эхо выбранная учетная запись:% _QBAcct%
пауза
:: RUI OUT
:: введите идентификатор торгового адреса и идентификатор заказа RUI для RUI
:: проверьте наличие дубликатов данных RUI в файле writeRUI.txt
CD..
cd RegKOut
find/i" % ($ OrderNumber)% "writeRUI.txt
echo errorlevel:% errorlevel%
если errorlevel 1 goto: RUIWRITE
если 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%
если errorlevel 1 goto: HEADWRITE
если errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: запись заголовка, отправка/обработка, скидка, реквизиты и данные комиссии в файл импорта QB IIF
echo% ($ OrderNumber)%% ($ Purchase_Date)% Invoice% ($ TransactionID)%% _QBAcct% Дебиторская задолженность% ($ Всего)%% _Rep% → writeIIF.txt
echo H/P% ($ Pack_Prep)% 1? → writeIIF.txt
echo SHP% ($ Shipping)% 1? → writeIIF.txt
echo DISC% ($ Discount)% 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
Ответы
Ответ 1
У вас есть дополнительная двойная кавычка в конце, которая добавляет ее обратно в конец строки (после удаления обоих кавычек из строки).
Input:
set widget="a very useful item"
set widget
set widget=%widget:"=%
set widget
Вывод:
widget="a very useful item"
widget=a very useful item
Примечание. Чтобы заменить Double Quotes "Single Quotes", выполните следующие действия:
set widget=%widget:"='%
Примечание. Чтобы заменить слово "World" (нечувствительным к регистру) с BobB, выполните следующие действия:
set widget="Hello World!"
set widget=%widget:world=BobB%
set widget
Вывод:
widget="Hello BobB!"
Что касается вашего начального вопроса (сохраните следующий код в пакетном файле .cmd или .bat и запустите):
@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
- это имя и путь Script.
%1
- это первый аргумент командной строки и т.д.
Ответ 2
Ваше заключение (1) звучит неправильно. В игре должен быть другой фактор.
Проблема кавычек в параметрах пакетного файла обычно решается путем удаления кавычек с помощью %~
, а затем, когда это необходимо, откладывать их вручную.
например:.
set cmd=%~1
set params=%~2 %~3
"%cmd%" %params%
Обратите внимание на цитаты вокруг %cmd%
. Без них путь с пробелами не будет работать.
Если вы можете опубликовать весь свой пакетный код, может быть, более конкретный ответ может быть сделан.
Ответ 3
Обычно я просто удаляю все кавычки из своих переменных:
set var=%var:"=%
И затем примените их снова, где бы они ни нуждались, например:
echo "%var%"
Ответ 4
Провел много времени, пытаясь сделать это простым способом.
После тщательного изучения цикла 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
Ответ 5
Это звучит как простая ошибка, в которой вы используете% ~ где-то, где вас не должно быть. Использование if% ~ принципиально не изменяет способ работы пакетных файлов, он просто удаляет кавычки из строки в этой единственной ситуации.
Ответ 6
Я узнал из этой , если вы используете XP или более того, что это будет просто работать само по себе:
SET params = %~1
Я не мог получить какие-либо другие решения для работы в Windows 7.
Чтобы перебрать их, я сделал следующее:
FOR %%A IN (%params%) DO (
ECHO %%A
)
Примечание. Вы получите только двойные кавычки, если вы передадите аргументы, разделенные пространством обычно.
Ответ 7
- set widget = "очень полезный элемент"
- установить виджет
- widget = "очень полезный элемент"
- set widget =% widget: "=%"
- установить виджет
- set widget = очень полезный элемент
Конечная цитата "
в строке 4 добавляет в строку цитату "
. Его следует удалить.
Синтаксис строки 4 заканчивается на %
Ответ 8
Я думал, что у меня есть решение, но вскоре я испытал необычное поведение с выполнением пакетных файлов. Внезапно CMD не распознает статусы длинного пути. Нормальное выполнение командного файла из полного пути
C:\Documents and Settings\Администратор\Мои документы \Txt\batchtest\dataout.bat
возвращает
'C:\Documents' не распознается как внутренняя или внешняя команда....
Там твоя вся проблема. CMD не понимает пробелы внутри имен файлов из командной строки, поэтому он думает, что вы пытаетесь передать
и Settings\Administrator\Мои документы \Txt\batchtest\dataout.bat
в качестве параметров для
"C:\Documents"
Программа.
Вам нужно процитировать его для запуска командного файла с пробелами в пути:
> "C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat"
работал бы.
Ответ 9
@echo off
Setlocal enabledelayedexpansion
Set 1=%1
Set 1=!1:"=!
Echo !1!
Echo "!1!"
Set 1=
Демонстрирует с кавычками или без них, независимо от того, имеет ли исходный параметр кавычки или нет.
И если вы хотите проверить существование параметра, который может быть или не быть в кавычках, поместите эту строку перед эхом выше:
Если '% 1' == '' goto yoursub
Но если вы проверяете наличие файла, который может иметь или не иметь кавычки, то это:
Если EXIST "! 1!" goto othersub
Обратите внимание, что использование одинарных кавычек и двойных кавычек различны.
Ответ 10
Все ответы завершены. Но хотелось добавить одну вещь,
set FirstName =% ~ 1
set LastName =% ~ 2
Эта строка должна работать, вам нужно небольшое изменение.
установите "FirstName =% ~ 1"
установите "LastName =% ~ 2"
Включить полное задание в кавычки. Он удалит кавычки без проблем. Это предпочтительный способ назначения, который фиксирует нежелательные проблемы с кавычками в аргументах.