116 votos

La eliminación de las comillas dobles de las variables en el archivo por lotes crea problemas con el entorno de CMD

¿Alguien puede ayudar con una forma efectiva y segura de eliminar las citas de las variables de los lotes?

He escrito un archivo 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 múltiples palabras, y por lo tanto están entre comillas.

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

Estas %variables se colocan a continuación en variables nombradas:

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

La verificación de las variables se hace por eco.

eco.%NombreDePrimeraVez%
eco.%Apellido%
eco.%ShipAddr%

los resultados se muestran como

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

Necesito eliminar las citas incluidas en las variables seleccionadas. Por ejemplo, Nombre y Apellido se usan en otro lugar y no deben incluir comillas.

En un archivo de prueba por lotes tuve éxito en la eliminación de las citas usando el carácter ~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 las declaraciones de camino largo. La ejecución normal de un archivo por lotes de la ruta completa

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

retornos

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

Así que parece que la adición del carácter ~tilde a las variables %1 %2...%n entrantes ha causado algún cambio. Posiblemente algunas variables de entorno han sido alteradas...

También intenté borrar las citas dentro de la variable con varios intentos usando el comando FOR. Eso parece incómodo y no he podido aprender cómo lograrlo creando 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 problemas.

1) Mi "corta y dulce" idea de insertar ~tilde en las variables entrantes %1 %2 (%~1, etc.) parece haber afectado algunos ajustes y alterado la forma en que CMD navega por los caminos largos.

2) Sigo buscando una forma limpia y fácil de eliminar las citas de las variables seleccionadas.

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

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

Cita textual
: dataout.bat
: revisión 25/12/2009 añadir ~tilde a las %variables entrantes para eliminar las "comillas" incrustadas.
: escribe la lista de direcciones usando los parámetros de la línea de comandos
: escribe la lista de salida de datos para la importación de QBooks IIF
: escribe los datos de la Orden Mercantil para la RUI
: cadena de comandos de muestra para la prueba
: listmail[nombre][apellido]["cadena de dirección"]["cadena de ciudad"][estado][zip][Pedido#][Fecha de compra][Nombre]["Nombre Apellido"][TransacciónID][Método de pago][Total][ProductID][Cantidad][Precio_Cada uno][Preparar el paquete] [Envío] [ComisiónPmt] [Factura#]
: ejemplo: dataout Bellewinkle Moose "123 Green Forest Way" "Vancouver" WA 98664 1004968 05/25/2009 "Bellewinkle Moose" "Olive Oyl" 101738 "On Account" 20.67 FK-1P 1 8.95 3.00 1.39 239 @echo off
cls
c:
cdc.
documentos y ajustes del cd \administrator\my documentos \txt\batchtest
procesamiento del eco %1 %2
VARISET
: Convierte los parámetros de la línea de comando %n en variables de cadena set ($NombreDeSobrino)=%~1
set ($Apellido)=%~2
set ($BillingAddress1)=%~3
set ($BillingCity)=%~4
set ($BillingState)=%~5
set ($BillingPostal)=%~6
set ($OrderNumber)=%~7
set ($Purch_Date)=%~8
set ($RegistrationName)=%~9
turno
set ($TransactionID)=%~9
turno
set ($PaymentMethod)=%~9
turno
set ($Total)=%~9
turno set ($ProductIdentifier)=%~9
turno
set ($Quantity)=%~9
turno
set ($Price_Each)=%~9
turno
set ($Pack_Prep)=%~9
turno
set ($Shipping)=%~9
turno
set ($ServiceFee)=%~9
turno
set ($Descuento)=%~9
turno
set ($Factura)=%~9
turno
set ($UnitPrice)=%~9
set _ShipCombName=%($NombreDeNombre)% %($Apellido)%
El nombre del combo de la nave eco es %_Nombre del Combo de la Nave%
pausa
: escribir cadenas varibables para el archivo de registro echo FN %($NombreDePrimera) % LN %($Apellido) % BA %($DirecciónDeFacturación1) % %($CiudadDeFacturación) % %($EstadoDeFacturación) % %($FacturaciónPostal) % %($NúmeroDeOrden) % %($FechaDeCompra) % %($NombreDeRegistro) % %($TransacciónID) % %($Método de pago)% %($Total)% %($Identificador de producto)% %($Cantidad)% %($Precio_Cada)% %($Preparación_de_paquete)% %($Envío)% %($Tarifa de servicio)% %($Descuento)%($Factura)% %($Precio_de_unidad)% %_Nombre_del_envío% >> d_out_log. txt
: Asignar cuenta por proveedor de servicios IF /i %($PaymentMethod)%==Amazon Receivables SET _QBAcct=Amazon.com
: 12-25-2009 añadido segundo método de pm't de Amazon para la versatilidad IF /i %($PaymentMethod)%==Amazonia SET _QBAcct=Amazonia.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)%==En la cuenta 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
: Asignar el designador de Rep basado en la cuenta QBAccount IF /i %($PaymentMethod)%==Amazon Receivables SET _Rep=Amazon
: 12-25-2009 añadido segundo método de pm't de Amazon para la versatilidad 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)%==En la cuenta 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
: comprobar si hay datos de dirección duplicados findstr /i /s "%_ShipCombName%" addrlist.txt
nivel de error de eco: %nivel de error%
si el nivel de error 1 va a: ADDRWRITE
si el nivel de error 0 va a :ADDRFOUND
ESCRIBIR echo %_ShipCombName% >> addrlist.txt
eco %($BillingAddress1)% >> addrlist.txt
eco %($BillingCity)% %($BillingState)% %($BillingPostal)% >> addrlist.txt
eco. >> addrlist.txt
Archivo de dirección de eco escrito
ADDRFOUND El eco seleccionado es %_Rep%
La cuenta seleccionada de eco es: %_QBAcct%
pausa
: RUI OUT
: escribe la identificación de la orden de compra y la identificación de la orden de la RUI a la RUI
: comprobar si hay datos duplicados de la RUI en writeRUI.txt cd..
cd RegKOut
encontrar /i "%($OrderNumber)%" escribirRUI.txt
nivel de error de eco: %nivel de error%
si el nivel de error 1 va a :RUIWRITE
si el nivel de error 0 va a :IIFWRITE
RUIWRITE eco %($Factura)% %($NúmeroDeOrden)% >> writeRUI.txt
: fin escribir RUI
: IIF OUT
IIFWRITE
: Compruebe si hay datos de facturas duplicadas en writeIIF.txt encontrar /i "%($OrderNumber)%" escribirIIF.txt
nivel de error de eco: %nivel de error%
si el nivel de error 1 va a :HEADWRITE
si el nivel de error 0 va a :LINEWRITE
CABEZAL
: escribe el encabezado, el barco/manejo, el descuento, los datos de los representantes y las comisiones en el archivo de importación QB IIF. eco %($Número de orden)% %($Fecha_de_compra)% Factura %($TransactionID)% %_QBAcct% Cuentas por cobrar %($Total)% %_Rep% >> writeIIF.txt
eco H/P %($Pack_Prep)% 1 ? >> writeIIF.txt
eco SHP %($Shipping)% 1 ? >> writeIIF.txt
eco DISCO %($Descuento)% 1 ? >> writeIIF.txt
echo Comm %($ServiceFee)% 1 ? >> writeIIF.txt
LINEA DE ESCRITURA
IF /i %($ProductIdentifier)% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
eco %($ProductIdentifier)%
WRITE_DISC escribe los precios rebajados de las variables personalizadas:
eco %($ProductIdentifier)% %($Price_Each)% %($Quantity)% ? >> writeIIF.txt
goto :EOF
WRITE_DEFA escribe los precios predeterminados analizados a partir de los datos de los productos
eco %($ProductIdentifier)% %($UnitPrice)% %($Quantity)% ? >> writeIIF.txt
goto :EOF
: 3 segundos de retraso
: TYPE NUL | CHOICE.COM /N /CY /TY,3 >NUL
EOF

191voto

Mr. Rick Puntos 630

@BobB

Tienes una cita doble extra al final, que es agregarla de nuevo al final de la cadena (después de quitar ambas citas de la cadena).

Entrada:

set widget="un elemento muy útil"
set widget
set widget=%widget:"=%
set widget

Salida:

widget="un artículo muy útil"
widget=un elemento muy útil

Nota: Para reemplazar las "comillas dobles" por las "comillas simples" haga lo siguiente:

set widget=%widget:"='%

Nota: Para reemplazar la palabra "Mundo" (no distingue entre mayúsculas y minúsculas) con BobB haga lo siguiente:

set widget="¡Hola Mundo!"
set widget=%widget:world=BobB%
set widget

Salida:

widget="¡Hola BobB!"

En cuanto a tu pregunta inicial (guarda el siguiente código en un archivo por lotes .cmd o .bat y corre):

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

Salida:

" C:\Users\Test\Documents\Batch Archivos \Remove Citas.cmd"
C:\Users\Test\Documents\Batch Archivos \Remove Citas.cmd
" C:\Users\Test\Documents\Batch Archivos \Remove Citas.cmd"
C:\Users\Test\Documents\Batch Archivos \Remove Citas.cmd
" C:\Users\Test\Documents\Batch Archivos \Remove Citas.cmd"
Presione cualquier tecla para continuar. . .

%0 es el script Nombre y Ruta.
%1 es el primer argumento de la línea de comando, y así sucesivamente.

43voto

atzz Puntos 7215

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

El problema de las citas en los parámetros de los archivos por lotes se resuelve normalmente eliminando las citas con %~ y luego volver a ponerlas manualmente cuando sea apropiado.

Por ejemplo..:

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

"%cmd%" %params%

Fíjese en las citas alrededor de %cmd% . Sin ellos, el camino con los espacios no funcionará.

Si pudieras publicar todo tu código de lote, tal vez se podría dar una respuesta más específica.

11voto

t1ck Puntos 9

Por lo general, sólo elimino todas las citas de con mis varsas:

set var=%var:"=%

Y luego aplicarlos de nuevo dondequiera que los necesitan, por ejemplo:

eco "%var%"

9voto

Vitaliy Ulantikov Puntos 2834

Pasó mucho tiempo tratando de hacer esto de una manera simple. Después de mirar bucle for cuidadosamente, me di cuenta de que puedo hacer esto con sólo una 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

3voto

John Knoeller Puntos 20754

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X