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

:ЭОФ


693   10  

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    
)

Примечание: Вы получите только двойные кавычки, если вы передаете аргументы, разделенные пробелом, как правило.

  1. установить виджет="очень полезная вещь"
  2. установить виджет
  3. виджет= "очень полезный элемент"
  4. установить виджет=%виджет:"=%"
  5. установить виджет
  6. установить виджет=очень полезный пункт"

конечная цитата " в строке 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

    Ничего не найдено.