116 votos

La eliminación de comillas dobles a partir de las variables en el archivo de proceso por lotes crea problemas con CMD medio ambiente

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

He escrito un archivo de proceso por lotes que logró que las importaciones de una lista de parámetros, %1, %2, %3, etc. y los coloca en nombre de las variables. Algunos de estos parámetros contienen varias palabras, y para ello se encierran entre comillas dobles.

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

Estos %variables son los próximos colocado en nombre de las variables:

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

la verificación de las variables se realiza por echo.

echo.%Nombre%
echo.%LastName%
echo.%ShipAddr%

visualización de resultados como

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

Necesito eliminar el que se incluyen las comillas en las variables seleccionadas. Por ejemplo, Nombre y Apellido son utilizados en otros lugares y no debe incluir las comillas.

En una prueba de archivo de proceso por lotes que fue un éxito en la eliminación de citas usando el ~carácter de tilde en las variables.

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

Pensé que tenía la solución, pero pronto me experimentado un comportamiento inusual con la ejecución de archivos por lotes. De repente CMD es no reconocer largo de la ruta instrucciones. Normal de ejecución de un archivo por lotes desde la ruta de acceso completa

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

devuelve

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

Por lo que parece que la adición de la ~carácter de tilde en las próximas %1 %2...%n variables ha causado algún cambio. Posiblemente algunas variables de entorno han sido alterada?

También traté de compensación de comillas desde dentro de la variable varios intentos, utilizando el comando FOR. Que parece torpe y no he sido capaz de saber 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 problemas.

1) Mi 'corto y dulce" idea de la inserción ~tilde en el entrante %1 %2 variables (%~1, etc) parece que ha afectado a algunos de los ajustes y alterado el modo CMD navega largas rutas de acceso.

2) todavía estoy en la búsqueda de un limpio y fácil manera de eliminar citas de nombre seleccionado las variables.

Cualquier ayuda para aquellos con más experiencia sería más apreciado. Estoy al final de mis habilidades aquí... necesito un poco de orientación por favor!

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

Blockquote
::: dataout.bat
:: revisión 12/25/2009 agregar ~tilde a la entrada de %variables para eliminar incrustado "entre comillas.
:: escribe la dirección de la lista de utilizar parámetros de línea de comandos
:: escribe la salida de datos lista para QBooks IIF importación
:: escribe Comerciante datos del Pedido de RUI
:: ejemplo de cadena de línea de comandos para probar
:: listmail[nombre][apellido]["dirección de la cadena"]["de la ciudad de cadena"][estado][código postal][Order#][PurchDate][Regname]["Nombre Apellidos"][TransactionID][PaymentMethod][Total][Idproducto][Cant][Price_Each][PackPrep] [Envío] [CommissionPmt] [Factura#]
:: ejemplo:: dataout Bellewinkle Alce "123 Verde Bosque Manera" "Vancouver" WA 98664 1004968 05/25/2009 "Bellewinkle Alce" "Olive Oyl" 101738 "En Cuenta" 20.67 FK-1P 1 8.95 3.00 1.39 239
@echo off
cls
c:
cd\
cd documents and settings\administrador\mis documentos\txt\batchtest
echo de procesamiento %1 %2
:VARISET
:: Convertir %n parámetros de línea de comandos para las variables de cadena
set ($Nombre)=%~1
set ($LastName)=%~2
set ($BillingAddress1)=%~3
set ($BillingCity)=%~4
set ($BillingState)=%~5
set ($BillingPostal)=%~6
set ($OrderNumber)=%~7
set ($Purch_Date)=%~8
set ($RegistrationName)=%~9
cambio
set ($TransactionID)=%~9
cambio
set ($PaymentMethod)=%~9
cambio
set ($Total)=%~9
cambio set ($ProductIdentifier)=%~9
cambio
set ($Cantidad)=%~9
cambio
set ($Price_Each)=%~9
cambio
set ($Pack_Prep)=%~9
cambio
set ($de Envío)=%~9
cambio
set ($ServiceFee)=%~9
cambio
set ($de Descuento)=%~9
cambio
set ($Factura)=%~9
cambio
set ($Preciounidad)=%~9
conjunto de _ShipCombName=%($Nombre)% %($Apellido)%
echo barco combinado nombre es %_ShipCombName%
pausa
:: write string varibables a logfile
echo FN %($Nombre)% LN %($Apellido)% BA %($BillingAddress1)% %($BillingCity)% %($BillingState)% %($BillingPostal)% %($OrderNumber)% %($Purch_Date)% %($RegistrationName)% %($TransactionID)% %($PaymentMethod)% %($Total)% %($ProductIdentifier)% %($Cantidad)% %($Price_Each)% %($Pack_Prep)% %($De envío)% %($ServiceFee)% %($de Descuento)% %($Factura)% %($Preciounidad)% %_ShipCombName% >> d_out_log.txt
:: Asignar una Cuenta por Proveedor de Servicio
SI /i %($PaymentMethod)%==Amazon CONJUNTO de cuentas por Cobrar _QBAcct=Amazon.com
:: 12-25-2009 añadido segunda Amazon pm no método para una mayor versatilidad
SI /i %($PaymentMethod)%==Amazon CONJUNTO _QBAcct=Amazon.com
SI /i %($PaymentMethod)%==MÁSTIL SET _QBAcct=Auth/Net
SI /i %($PaymentMethod)%==MasterCard CONJUNTO _QBAcct=Auth/Net
SI /i %($PaymentMethod)%==Visa CONJUNTO _QBAcct=Auth/Net
SI /i %($PaymentMethod)%==PayPal CONJUNTO _QBAcct=PayPalPmts
SI /i %($PaymentMethod)%==En Cuenta _QBAcct=%($RegistrationName)%
SI /i %($PaymentMethod)%==Correo ESTABLECER _QBAcct=%($RegistrationName)%
SI /i %($PaymentMethod)%==AMER CONJUNTO _QBAcct=Auth/Net
SI /i %($PaymentMethod)%==DISCO de _QBAcct=Auth/Net
:: Asignar Rep clasificador basado en QBAccount
SI /i %($PaymentMethod)%==Amazon cuentas por Cobrar CONJUNTO _Rep=Amazon
:: 12-25-2009 añadido segunda Amazon pm no método para una mayor versatilidad
SI /i %($PaymentMethod)%==Amazon CONJUNTO _Rep=Amazon
SI /i %($PaymentMethod)%==MÁSTIL SET _Rep=BlueZap
SI /i %($PaymentMethod)%==MasterCard CONJUNTO _Rep=BlueZap
SI /i %($PaymentMethod)%==Visa CONJUNTO _Rep=BlueZap
SI /i %($PaymentMethod)%==PayPal CONJUNTO _Rep=BlueZap
SI /i %($PaymentMethod)%==En Cuenta _Rep=R B
SI /i %($PaymentMethod)%==Correo ESTABLECER _Rep=R B
SI /i %($PaymentMethod)%==AMER CONJUNTO _Rep=BlueZap
SI /i %($PaymentMethod)%==DISCO de _Rep=BlueZap
:: comprobación de duplicados los datos de la dirección
findstr /i /s "%_ShipCombName%" addrlist.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :ADDRWRITE
if errorlevel 0 goto :ADDRFOUND
:ADDRWRITE
echo %_ShipCombName% >> addrlist.txt
echo %($BillingAddress1)% >> addrlist.txt
echo %($BillingCity)% %($BillingState)% %($BillingPostal)% >> addrlist.txt
eco. >> addrlist.txt
eco de la Dirección de Archivo Escrito
:ADDRFOUND
echo seleccionado rep es %_Rep%
echo la cuenta seleccionada es: %_QBAcct%
pausa
:: RUI FUERA
:: escritura de Comerciante de IDENTIFICACIÓN de la Orden Y RUI ID de Pedido para RUI
:: comprobación de duplicados RUI datos en writeRUI.txt
cd..
cd RegKOut
find /i "%($OrderNumber)%" writeRUI.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :RUIWRITE
if errorlevel 0 goto :IIFWRITE
:RUIWRITE
echo %($Factura)% %($OrderNumber)% >> writeRUI.txt
:: el fin de escribir RUI
:: IIF FUERA
:IIFWRITE
:: Comprobación de duplicados los datos de la factura en writeIIF.txt
find /i "%($OrderNumber)%" writeIIF.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :HEADWRITE
if errorlevel 0 goto :LINEWRITE
:HEADWRITE
:: escriba el Encabezado de envío/Manipulación, descuento, Rep & datos de la comisión para QB IIF archivo de importación
echo %($OrderNumber)% %($Purch_Date)% de la Factura %($TransactionID)% %_QBAcct% Cuentas por Cobrar %($Total)% %_Rep% >> writeIIF.txt
echo de H/P %($Pack_Prep)% 1 ? >> writeIIF.txt
echo SHP %($de Envío)% 1 ? >> writeIIF.txt
echo de DISCO %($de Descuento)% 1 ? >> writeIIF.txt
echo Comm %($ServiceFee)% 1 ? >> writeIIF.txt
:LINEWRITE
SI /i %($ProductIdentifier)% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
echo %($ProductIdentifier)%
:WRITE_DISC
::escribe precios de descuento se analiza a partir de la variable personalizada:
echo %($ProductIdentifier)% %($Price_Each)% %($Cantidad)% ? >> writeIIF.txt
goto :EOF
:WRITE_DEFA
:escribe precios por defecto se analiza a partir de los datos del Producto
echo %($ProductIdentifier)% %($Preciounidad)% %($Cantidad)% ? >> writeIIF.txt
goto :EOF
:: 3 segundos de retraso
:: TIPO DE NUL | CHOICE.COM /N /CY /TY,3 >NUL
:EOF

191voto

Mr. Rick Puntos 630

@BobB


Usted tiene un extra de doble cita al final, que es la adición de nuevo al final de la cadena (después de la eliminación tanto de las comillas de la cadena).


Entrada:

conjunto de widget="un elemento muy útil"
conjunto de widget
conjunto de widget=%widget:"=%
conjunto de widget

Salida:

widget="un elemento muy útil"
widget=un elemento muy útil

Nota: Para sustituir las Comillas Dobles "con Comillas simples' hacer lo siguiente:

conjunto de widget=%widget:"='%

Nota: Para sustituir la palabra "Mundo" (no distingue mayúsculas de minúsculas) con BobB hacer lo siguiente:

conjunto de widget="Hola Mundo!"
conjunto de widget=%widget:mundo=BobB%
conjunto de widget

Salida:

widget="Hola BobB!"

En cuanto a tu pregunta inicial, que va (guarde el código siguiente en un archivo de proceso por lotes .cmd o .bat y ejecutar):

@ECHO OFF
ECHO %0
CONJUNTO de BathFileAndPath=%~0
ECHO %BathFileAndPath%
ECHO "%BathFileAndPath%"
ECHO %~0
ECHO %0
PAUSA

Salida:

"C:\Users\Test\Documents\Batch Los Archivos De Quitar Las Comillas.cmd"
C:\Users\Test\Documents\Batch Los Archivos De Quitar Las Comillas.cmd
"C:\Users\Test\Documents\Batch Los Archivos De Quitar Las Comillas.cmd"
C:\Users\Test\Documents\Batch Los Archivos De Quitar Las Comillas.cmd
"C:\Users\Test\Documents\Batch Los Archivos De Quitar Las Comillas.cmd"
Presione cualquier tecla para continuar . . .

%0 es el Nombre del Script y la Ruta de acceso.
%1 es el primer argumento de línea de comandos, y así sucesivamente.

43voto

atzz Puntos 7215

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

El problema de las comillas en el archivo de proceso por lotes parámetros se suele resolver mediante la eliminación de las comillas con la %~ y, a continuación, volver a ponerlos manualmente cuando sea apropiado.

E. g.:

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

"%cmd%" %params%

Nótese las comillas alrededor de %cmd%. Sin ellos, la ruta con espacios no funciona.

Si usted podría publicar la totalidad de su código de lote, tal vez la respuesta más específica.

9voto

Vitaliy Ulantikov Puntos 2834

Pasamos un montón de tiempo tratando de hacer esto de una manera sencilla. Después de mirar POR bucle detenidamente, 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 se utiliza %~ en algún lugar donde no debería estar. El uso de la si %~ no cambiar fundamentalmente la manera en archivos de proceso por lotes de trabajo, simplemente elimina las comillas de la cadena en esa misma 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