espacios blanco variables batch-file cmd quotes

variables - espacios en blanco en cmd



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

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. Ejecución normal del archivo por lotes desde la ruta completa

C: / Documents and Settings / Administrator / Mis documentos / Txt / batchtest / dataout.bat

devoluciones

''C: / Documents'' no se reconoce como un comando interno o externo ....

Ahí está todo tu problema. CMD no entiende los espacios dentro de los nombres de archivo desde la línea de comandos, por lo que cree que estás tratando de pasar

y Configuración / Administrador / Mis documentos / Txt / batchtest / dataout.bat

como parámetros para el

"C: / Documents"

programa.

Debe citarlo para ejecutar un archivo por lotes con espacios en la ruta:

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

habría funcionado.

¿Alguien puede ayudar con la forma efectiva y segura de eliminar las cotizaciones de las variables del lote?

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 varias palabras y, por lo tanto, están entre comillas dobles.

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

Estas% de variables se colocan a continuación en variables con nombre:

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

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

echo.% FirstName%
echo.% LastName%
echo.% 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, FirstName y LastName se usan en otro lugar y no deben incluir comillas.

En un archivo por lotes de prueba, tuve éxito eliminando 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 sentencias de ruta larga. Ejecución normal del archivo por lotes desde la ruta completa

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

devoluciones

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

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

También traté de borrar citas de variables dentro de 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 idea ''corta y dulce'' de insertar ~ tilde en las variables% 1% 2 entrantes (% ~ 1, etc.) parece haber afectado algunas configuraciones y alterado la forma en que CMD navega por 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 aquellos con más experiencia sería muy apreciada. Estoy al final de mis habilidades aquí ... necesito orientación, por favor!

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

Blockquote
:: dataout.bat
:: revisión 12/25/2009 agregar ~ tilde a% de variables entrantes para eliminar las comillas incrustadas.
:: escribe una lista de direcciones usando parámetros de línea de comando
:: escribe la lista de salida de datos para la importación QBooks IIF
:: escribe los datos del pedido de comerciante para RUI
:: cadena de línea de comandos de muestra para probar
:: listmail [firstname] [lastname] ["cadena de direcciones"] ["cadena de ciudad"] [estado] [zip] [N.º de pedido] [PurchDate] [Nombre de registro] ["Nombre de Apellido"] [ID de transacción] [PaymentMethod] [ Total] [ProductID] [Qty] [Price_Each] [PackPrep] [Envío] [CommissionPmt] [Factura n.º]
:: ejemplo: 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
do:
discos compactos/
documentos y configuraciones de cd / administrator / my documents / txt / batchtest
procesamiento de eco% 1% 2
: VARISET
:: Convierte% n parámetros de línea de comando en variables de cadena
set ($ FirstName) =% ~ 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
shift set ($ ProductIdentifier) ​​=% ~ 9
cambio
conjunto ($ Cantidad) =% ~ 9
cambio
set ($ Price_Each) =% ~ 9
cambio
set ($ Pack_Prep) =% ~ 9
cambio
set ($ Shipping) =% ~ 9
cambio
set ($ ServiceFee) =% ~ 9
cambio
set ($ Discount) =% ~ 9
cambio
set ($ Invoice) =% ~ 9
cambio
set ($ UnitPrice) =% ~ 9
establecer _ShipCombName =% ($ FirstName)%% ($ LastName)%
El nombre combinado de echo ship es% _ShipCombName%
pausa
:: escribir cadenas varibles en el archivo de registro
echo FN% ($ FirstName)% LN% ($ LastName)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date )%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Quantity)%% ($ Price_Each)%% ($ Pack_Prep)% % ($ Shipping)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: Asignar cuenta por proveedor de servicios
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009 añadió el segundo método Amazon pm''t para la versatilidad
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)% == En cuenta SET _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == Correo SET _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == AMER SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth / Net
:: Asignar designador de Rep basado en QBAccount
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 12-25-2009 añadió el segundo método Amazon pm''t 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 = RB
IF / i% ($ PaymentMethod)% == Correo SET _Rep = RB
IF / i% ($ PaymentMethod)% == AMER SET _Rep = BlueZap
IF / i% ($ PaymentMethod)% == DISC SET _Rep = BlueZap
:: verificar los datos de dirección duplicados
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
archivo de dirección echo escrito
: ADDRFOUND
El representante de eco seleccionado es% _Rep%
La cuenta eco seleccionada es:% _QBAcct%
pausa
:: RUI OUT
:: escriba ID de pedido de comerciante y ID de pedido de RUI en RUI
:: verificar datos duplicados de RUI en writeRUI.txt
discos compactos..
cd RegKOut
find / i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: RUIWRITE
if errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo% ($ Invoice)%% ($ OrderNumber)% >> writeRUI.txt
:: fin escribir RUI
:: IIF FUERA
: IIFWRITE
:: Compruebe si hay datos de factura duplicados en writeIIF.txt
find / i "% ($ OrderNumber)%" writeIIF.txt
echo errorlevel:% errorlevel%
si errorlevel 1 goto: HEADWRITE
if errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: escribir en encabezado, envío / manejo, descuento, datos de prueba y comisión en el 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
IF / i% ($ ProductIdentifier)% equ PH-1 goto WRITE_DEFA ELSE goto WRITE_DISC
echo% ($ ProductIdentifier)%
: WRITE_DISC
:: escribe los precios descontados analizados a partir de una variable personalizada:
echo% ($ ProductIdentifier)%% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
Ir a: EOF
: WRITE_DEFA
: escribe los precios predeterminados analizados a partir de los datos del Producto
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
Ir a: EOF
:: retraso de 3 segundos
:: TIPO NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF


  1. set widget = "un elemento muy útil"
  2. establecer widget
  3. widget = "un elemento muy útil"
  4. set widget =% widget: "=%"
  5. establecer widget
  6. set widget = un elemento muy útil "

La cita final " en la línea 4 agrega una cita " a la cadena. Debe ser eliminado. La sintaxis para la línea 4 termina con %


Aprendí de este link , si estás usando XP o superior que esto simplemente funcionará solo:

SET params = %~1

No pude obtener ninguna de las otras soluciones aquí para trabajar en Windows 7.

Para iterar sobre ellos, hice esto:

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

Nota: solo obtendrá comillas dobles si pasa argumentos separados por un espacio típicamente.


Esto suena como un simple error donde estás usando% ~ en algún lugar donde no deberías 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.


Normalmente elimino todas las citas de mis variables con:

set var=%var:"=%

Y luego aplíquelos nuevamente donde los necesite, por ejemplo:

echo "%var%"


Pasé mucho tiempo tratando de hacer esto de una manera simple. Después de mirar el ciclo FOR con cuidado, me di cuenta de que puedo hacer esto con solo 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


Tiene una comilla doble adicional al final, que la agrega al final de la cadena (después de eliminar ambas comillas de la cadena).

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 reemplazar las comillas dobles "con comillas simples" haga lo siguiente:

set widget=%widget:"=''%

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

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

Salida:

widget="Hello BobB!"

En lo que respecta a su pregunta inicial (guarde el siguiente código en un archivo por lotes .cmd o .bat y ejecútelo):

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


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

establecer FirstName =% ~ 1

establecer LastName =% ~ 2

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

establecer "Nombre =% ~ 1"

establecer "Apellido =% ~ 2"

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


Tu 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 normalmente se resuelve eliminando las comillas con %~ y luego volviendo a ponerlas manualmente cuando corresponda.

P.ej:

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

Tenga en cuenta las cotizaciones alrededor de %cmd% . Sin ellos, el camino con espacios no funcionará.

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


@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 puede o no estar entre comillas, coloque esta línea antes de los ecos anteriores:

Si ''% 1'' == '''' goto yoursub

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

Si EXISTE "! 1!" Ir a Otherub

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