2009-12-26 69 views
91

¿Alguien puede ayudar con la forma efectiva y segura de eliminar las cotizaciones de las variables del lote?Eliminar las comillas dobles de las variables en el archivo por lotes crea problemas con el entorno CMD

He escrito un archivo de proceso por lotes que importa con éxito una lista de parámetros% 1,% 2,% 3 etc. y los coloca en variables con nombre. Algunos de estos parámetros contienen varias palabras y, por lo tanto, están entre comillas dobles.

> "Susie Jo" (%1) 
> "Smith Barnes" (%2) 
> "123 E. Main St." (%3) 

Estas variables% están colocados en el próximo variables con nombre:

> set FirstName=%1 
> set LastName=%2 
> set ShipAddr=%3 

verificación de las variables se realiza mediante eco.

eco.% FirstName%
eco.% Apellido%
eco.% ShipAddr%

Mostrar resultados como

"Susie Jo" 
"Smith Barnes" 
"123 E. Main St." 

necesito para eliminar las comillas incluidas en seleccionados variables. Por ejemplo, FirstName y LastName se usan en otro lugar y no deben incluir comillas.

En un archivo por lotes de prueba logré eliminar las comillas usando el caracter ~ tilde en las variables.

> set FirstName=%~1 
> set LastName=%~2 

Pensé que tenía la solución, pero pronto experimenté un comportamiento inusual con la ejecución de archivos por lotes. De repente, CMD no reconoce sentencias de ruta larga. la ejecución normal del archivo por lotes desde ruta completa

> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat 

vuelve

> 'C:\Documents' is not recognized as an internal or external command.... 

Por lo tanto, parece que la adición de la tilde ~ a los prometedores en% 1% 2% n variables ... ha causado algún cambio. Posiblemente algunas variables de entorno han sido alteradas?

También traté de borrar citas de dentro de la variable con varios intentos usando el comando FOR. Eso parece torpe y no he sido capaz de aprender cómo lograr esto mediante la creación de una lista de variables para realizar la tarea:

algo como esto:

for %%g in (%FirstName% %LastName%) do (
set %%g=%%~g 
set %%h=%%~h 
set FirstName=%%~g 
set LastName=%%h 
echo.%FirstName% %LastName% 
) 

creo que tengo dos cuestiones.

1) Mi idea 'corta y dulce' de insertar ~ tilde en las% 1% 2 variables entrantes (% ~ 1, etc.) parece haber afectado algunas configuraciones y alterado la forma en que CMD navega nombres de ruta largos.

2) Todavía estoy en busca de una manera limpia y fácil de eliminar las citas de las variables nombradas seleccionadas.

Cualquier ayuda para los más experimentados sería muy apreciada. Estoy al final de mis habilidades aquí ... necesito orientación, por favor!

editar 12/26/2009 13:36 PST archivo todo el lote:

cita en bloque
:: dataout.bat
:: revisión 12/25/2009 complemento ~ tilde a las variables de entrada% para eliminar incrustados "entre comillas.
:: escribe lista de direcciones utilizando la línea de comandos parámetros
:: escribe lista de salida de datos para importar QBooks IIF
:: escribe datos de pedido del comerciante para RUI
:: cadena de línea de comandos de muestra para probar
:: listmail [firstname] [lastname] ["cadena de dirección"] ["cadena de ciudad"] [estado] [zip] [N.º de pedido] [PurchDate] [Regname] [" FirstName LastName "] [TransactionID] [PaymentMethod] [Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Shipping] [CommissionPmt] [Factura] #
:: example: dataout Bellewinkle Moose" 123 Green Forest Way " "Vancouver" WA 98664 1004968 25/05/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "En cuenta" 20.67 FK-1P 1 8.95 3.00 1.39 239
@echo off cls

c:
cd \ cd
documentos y ajustes \ Administrador \ Mis documentos \ txt \ batchtest
echo% 1% 2 procesamiento
: VARISET
:: Convert % parámetros de línea de comando n a variables de cadena
conjunto ($ FirstName) =% ~ 1
conjunto ($ LastName) =% ~ 2
conjunto ($ BillingAddress1) =% ~ 3
conjunto ($ BillingCit y) =% ~ 4
conjunto ($ BillingState) =% ~ 5
conjunto ($ BillingPostal) =% ~ 6
conjunto ($ OrderNumber) =% ~ 7
conjunto ($ Purch_Date) =% ~ 8
conjunto ($ RegistrationName) =% ~ 9
cambio
conjunto ($ TransactionID) =% ~ 9
cambio
conjunto ($ PaymentMethod) =% ~ 9
cambio
conjunto ($ total) = % ~ 9
shift conjunto ($ ProductIde ntifier) ​​=% ~ 9
cambio
conjunto ($ Cantidad) =% ~ 9
cambio
conjunto ($ Price_Each) =% ~ 9
cambio
conjunto ($ Pack_Prep) =% ~ 9
cambiar
conjunto ($ envío) =% ~ 9
cambio
conjunto ($ servicefee) =% ~ 9
cambio
conjunto ($ Descuento) =% ~ 9
cambio
conjunto ($ Factura) =% ~ 9
cambio
conjunto ($ PrecioUnidad) =% ~ 9
conjunto _ShipCombName =% ($ FirstName)%% ($ Apellidos)%
eco nombre combinado barco es% _ShipCombName
pausa
cadena :: write% varibables a logfile
eco FN% ($ FirstName)% LN% ($ Apellidos)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)% % ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date)%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Cantidad)%% ($ Price_Each)%% ($ Pack_Prep)%% ($ Shipping)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)% % _ShipCombName% >> d_out_log.txt
:: Asignar cuenta el Proveedor de Servicios
SI/i% ($ PaymentMethod) ==% Amazon cobrar La _QBAcct = Amazon.com
:: 25/12/2009 añadió segundo Amazon pm't método de versatilidad
IF/i% ($ PaymentMethod)% == Amazon SET _QBAcct = Amazon.com
SI/i% ($ PaymentMethod) ==% de MAST SET _QBAcct = Aut/Net
SI/i% ($ PaymentMethod) ==% MasterCard SET _QBAcct = Aut/Net
SI/i% ($ PaymentMethod)% == Visa SET _QBAcct = Auth/Net
IF/i% ($ PaymentMethod)% == PayPal SET _QBAcct = PayPalPmts
IF/i% ($ PaymentMethod)% == Cuenta activa SET _QBAcct =% ($ RegistrationName)%
SI/i% ($ PaymentMethod)% == electrónico conjunto _QBAcct =% ($ RegistrationName)%
SI/i% ($ PaymentMethod) ==% AMER SET _QBAcct = Aut/Net
SI/i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth/Net
:: Assign Rep designador basado en QBAccount
IF/i% ($ PaymentMethod)% == Amazon cobrar SET _rep = Amazon
:: 25/12/2009 añadió segundo método pm't Amazon para versatilidad
IF/i% ($ PaymentMethod)% == Amazon SET _Rep = Amazon
IF/i% ($ PaymentMethod)% == MAST SET _Rep = BlueZap
SI/i% ($ PaymentMethod)% == MasterCard SET _Rep = BlueZap
SI/i% ($ PaymentMethod) ==% Visa SET _rep = BlueZap
SI/i% ($ PaymentMethod) ==% PayPal SET _rep = BlueZap
SI/i% ($ PaymentMethod)% == En Cuenta SET _Rep = RB
SI/i% ($ PaymentMethod)% == electrónico conjunto _rep = RB
SI/i% ($ PaymentMethod) ==% AMER SET _rep = BlueZap
SI/i% ($ PaymentMethod) ==% DISCOS _rep = BlueZap
:: comprobar datos de direcciones duplicadas
findstr/i/s "% _ShipCombName%" addrlist.txt
eco errorlevel:% errorlevel%
si errorlevel 1 Goto: ADDRWRITE
si errorlevel 0 Ir a: ADDRFOUND
: ADDRWRITE
echo% _ShipCombName% >> addrlist.txt
e cho% ($ BillingAddress1)% >> addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt
eco. >> addrlist.txt Archivo
eco dirección escrita
: ADDRFOUND
eco seleccionado es representante% _rep%
eco seleccionado se cuenta:% _QBAcct%
pausa
:: RUI OUT
:: escribir pedido del comerciante Identificación & RUI ID pedido a Rui
:: comprobar si hay datos RUI duplicado en writeRUI.txt
cd .. cd
RegKOut
find/i "% ($ OrderNumber)%" writeRUI.txt
eco nivel de error:% errorlevel%
si errorlevel 1 Ir a: RUIWRITE
si errorlevel 0 Ir a: IIFWRITE
: RUIWRITE
echo% ($ Factura)%% ($ OrderNumber) >> writeRUI%.txt
:: extremo de escritura RUI
:: IIF OUT
: IIFWRITE
:: Compruebe si hay datos de las facturas duplicadas en writeIIF.txt
find/i "% ($ OrderNumber)%" writeIIF.txt
eco nivel de error:% errorlevel%
si errorlevel 1 Ir a: HEADWRITE
si errorlevel 0 Ir a: LINEWRITE
: HEADWRITE
:: escribir Cabecera, Barco/manipulación, descuento, Rep & datos de la comisión a archivo de importación QB IIF
echo% ($ OrderNumber)%% ($ Purch_Date)% Invoice% ($ TransactionID)%% _QBAcct% Cuentas por cobrar% ($ Total)%% _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
SI/i% ($ ProductIdentifier) ​​equ% PH-1 Goto WRITE_DEFA WRITE_DISC ELSE Goto
echo% ($ ProductIdentifier)%
: WRITE_DISC
:: escribe precios reducidos analiza de la variable personalizada:
echo% ($ ProductIdentifier)%% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
Ir a: EOF
: WRITE_DEFA
: escribe precios predeterminados analizan a partir de datos de producto
echo% ($ ProductIdentifier)%% ($ PrecioUnidad)%% ($ Cantidad)%? >> writeIIF.txt
pase a: EOF
:: Retraso de 3 segundos
:: TYPE NUL | CHOICE.COM/N/CY/TY, 3> NUL
: EOF

+0

¿Podría usar PowerShell para hacer esto? Sospecho que obtendrás un poco más de control si usas PowerShell. –

+1

Comprobé el archivo por lotes, parece funcionar bien (después de haber arreglado la línea "shift set ($ ProductIdentifier) ​​=% ~ 9" - que, creo, es un artefacto de copiar y pegar aquí) . – atzz

+0

Gracias Robert Harvey; He estado viendo PowerShell. No tengo mucha experiencia con programación ... no estoy seguro de cómo sería la curva de aprendizaje. Tengo algo de experiencia con archivos por lotes, razón principal por la que elegí esto. Tengo la intención de compilar el lote para que funcione más rápido. Gracias por responder. – BobB

Respuesta

155

Usted tiene una cita doble extra al final, que es la adición de nuevo al final de la cadena (después de la eliminación de ambas citas de la cadena).

de entrada:

set widget="a very useful item" 
set widget 
set widget=%widget:"=% 
set widget 

Salida:

widget="a very useful item" 
widget=a very useful item 

Nota: Para volver a colocar comillas dobles "con comillas simples 'hacer lo siguiente:

set widget=%widget:"='% 

Nota: Para sustituir la palabra "Mundo" (no sensible a mayúsculas y minúsculas) con BobB haga lo siguiente:

set widget="Hello World!" 
set widget=%widget:world=BobB% 
set widget 

Salida:

widget="Hello BobB!" 

En cuanto a su pregunta inicial va (guardar el código siguiente en un archivo por lotes .bat o .cmd y correr):

@ECHO OFF 
ECHO %0 
SET BathFileAndPath=%~0 
ECHO %BathFileAndPath% 
ECHO "%BathFileAndPath%" 
ECHO %~0 
ECHO %0 
PAUSE 

Salida:

"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 es el nombre del script y la ruta.
%1 es el primer argumento de línea de comando, y así sucesivamente.

+1

¡Gracias, Sr. Rick! Problema resuelto. Muy bien de tu parte darme ejemplos tan explícitos. Aprecio mucho la tutela! – BobB

+0

Gracias, esto era lo que buscaba después 'SET BathFileAndPath =% ~ 0' (en realidad, mi matriz param comienza en 1, así que utilicé 'SET BathFileAndPath =% ~ 1' –

+0

¿Puedes explicar por qué'% widget: "=%' se deshace de las comillas? – CodyBugstein

28

Su conclusión (1) suena mal. Debe haber algún otro factor en juego.

El problema de las cotizaciones en los parámetros del archivo por lotes se resuelve normalmente quitando las comillas con %~ y luego volviendo a ponerlas manualmente cuando corresponda.

ej .:

set cmd=%~1 
set params=%~2 %~3 

"%cmd%" %params% 

Nota las comillas alrededor de %cmd%. Sin ellos, el camino con espacios no funcionará.

Si pudiera publicar todo el código del lote, quizás se podría hacer una respuesta más específica.

+1

Acepto; me parece que el conjunto var =% ~ 1 debería funcionar bien. Publicaré todo el archivo por lotes según lo solicitado. – BobB

+0

MS Reference: [Uso de parámetros de proceso por lotes] (http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true). ¿Quién sabía que había tantos modificadores? Como referencia, el documento MS oficial da la descripción de '% ~ 1' como' Expande% 1 y elimina las comillas que rodean ("") .' – cod3monk3y

+0

@ cod3monk3y Además, es posible preguntar 'cmd' sobre estos modificadores: 'call /?' para ayuda sobre modificadores de parámetros, 'set /?' para modificadores de variable (probablemente no muy intuitivo). Muy útil. – atzz

3

Esto suena como un simple error donde está usando% ~ en algún lugar donde no debería estar. El uso si% ~ no cambia fundamentalmente la forma en que funcionan los archivos por lotes, simplemente elimina las comillas de la cadena en esa única situación.

+0

gracias John K. Agradezco la ayuda y la validación de mis conjeturas. Es bueno obtener un buen consejo de personas con experiencia! – BobB

8

por lo general sólo se quita todas las frases de mi variables con:

set var=%var:"=% 

y luego aplicar de nuevo siempre que los necesito, por ejemplo,:

echo "%var%" 
+1

-1 No funciona –

+0

Al principio tuve problemas con esto, resultó que estaba viendo el ':' como '.' - después de resolverlo, funcionó sin problemas. ¡Un gran consejo! – DaveU

+0

No funciona si la cadena tiene & en ella. –

0
  1. conjunto de widgets = "un elemento muy útil"
  2. conjunto de widgets
  3. widget de
  4. = "un elemento muy útil"
  5. conjunto de widgets widget de =%: "=%"
  6. conjunto de widgets
  7. widget de set = un elemento muy útil"

La cita de arrastre " en la línea 4 es la adición de una cotización " a la cadena. Debe ser eliminado. La sintaxis de la línea 4 termina con %

+0

-1 No se pudo hacer que esto funcione –

+0

@ user195488 - lee la línea 3 como ** observa que se muestra: 'widget =" un elemento muy útil "' ** y lee la línea 6 como ** observa que se muestra: 'widget = un elemento muy útil" '** y entiendo que la línea 7 sería 'set widget =% widget:" =% 'y la línea 8 sería ** observe que la línea mostrada' widget = a muy usefu l artículo' ya no tiene una cita final **. –

8

Pasé mucho tiempo tratando de hacer esto de una manera sencilla. Después de mirar bucle FOR con cuidado, me di cuenta de que puedo hacer esto con una sola línea de código:

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I 

Ejemplo:

@ECHO OFF 
SET Quoted="Test string" 

FOR /F "delims=" %%I IN (%Quoted%) DO SET Unquoted=%%I 

ECHO %Quoted% 
ECHO %Unquoted% 

Salida:

"Test string" 
Test string 
+0

Este método no es relevante mientras "SET Quoted = Test string". La siguiente pregunta es cómo diferir "(comillas dobles) existen o no. A quién le interese, gracias de antemano. –

2

he aprendido de este link, si usa XP o una versión superior, esto simplemente funcionará solo:

SET params = %~1

no pude conseguir ninguna de las otras soluciones aquí para trabajar en Windows 7.

Para iterar sobre ellos, lo hice:

FOR %%A IN (%params%) DO ( 
    ECHO %%A  
) 

Nota: Sólo tendrá comillas dobles si pasa argumentos separados por un espacio típicamente.

0

Pensé que tenía la solución, pero pronto experimenté un comportamiento inusual con la ejecución de archivos por lotes. De repente, CMD no reconoce sentencias de ruta larga. la ejecución normal del archivo por lotes desde ruta completa

C: \ Documents and Settings \ Administrador \ Mis documentos \ Txt \ batchtest \ dataout.bat

vuelve

'C: \ documentos no se reconoce como un comando interno o externo ....

no eres tú todo el problema CMD no entiende espacios dentro de los nombres de archivo desde la línea de comandos, por lo que piensa que está tratando de pasar

and Settings \ Administrador \ Mis documentos \ Txt \ batchtest \ dataout.bat

como parámetros a la

"C: \ Documents" del programa

.

usted necesita cotizar para que se ejecute un archivo por lotes con espacios en la ruta:

> "C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat" 

hubiera funcionado.

0
@echo off 

Setlocal enabledelayedexpansion 

Set 1=%1 

Set 1=!1:"=! 

Echo !1! 

Echo "!1!" 

Set 1= 

Demuestra con o sin comillas, independientemente de si el parámetro original tiene comillas o no.

Y si desea probar la existencia de un parámetro que pueden o no estar entre comillas, poner esta línea antes de que los ecos anteriores:

Si '% 1' == '' Goto yoursub

Pero si se comprueba la existencia de un archivo que puede tener o no comillas, entonces es:

If EXIST "! 1!" goto othersub

Tenga en cuenta que el uso de comillas simples y comillas dobles es diferente.

0

Todas las respuestas están completas. Pero quería añadir una cosa,

conjunto Nombre =% ~ 1

conjunto Apellido =% ~ 2

Esta línea debería haber funcionado, se necesita un pequeño cambio.

set "Nombre =% ~ 1" conjunto

"Apellido =% ~ 2"

Incluir la asignación completa dentro de comillas. Eliminará las citas sin problema. Esta es una forma preferida de asignación que corrige problemas no deseados con comillas en argumentos.

Cuestiones relacionadas