Удаление двойных кавычек из переменных в пакетном файле создает проблемы с средой 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"

Включить полное задание в кавычки. Он удалит кавычки без проблем. Это предпочтительный способ назначения, который фиксирует нежелательные проблемы с кавычками в аргументах.