Menghapus tanda kutip ganda dari variabel dalam file batch menciptakan masalah dengan lingkungan CMD

117

Adakah yang bisa membantu dengan cara yang efektif dan aman untuk menghapus kutipan dari variabel batch?

Saya telah menulis file batch yang berhasil mengimpor daftar parameter% 1,% 2,% 3 dll dan menempatkannya ke dalam variabel bernama. Beberapa dari parameter ini mengandung banyak kata, dan karenanya diapit tanda kutip ganda.

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

% Variabel ini selanjutnya ditempatkan dalam variabel bernama:

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

verifikasi variabel dilakukan dengan echo.

echo.% FirstName%
echo.% LastName%
echo.% ShipAddr%

hasil ditampilkan sebagai

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

Saya perlu menghilangkan kutipan yang disertakan pada variabel terpilih. Misalnya, NamaDepan dan Nama Belakang digunakan di tempat lain dan tidak boleh menyertakan tanda kutip.

Dalam file batch pengujian saya berhasil menghilangkan tanda kutip menggunakan karakter ~ tilde dalam variabel.

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

Saya pikir saya punya solusinya, tetapi saya segera mengalami perilaku yang tidak biasa dengan eksekusi file batch. Tiba-tiba CMD tidak mengenali pernyataan jalur panjang. Eksekusi normal file batch dari jalur lengkap

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

kembali

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

Jadi akan terlihat bahwa penambahan karakter ~ tilde ke variabel% 1% 2 ...% n yang akan datang telah menyebabkan beberapa perubahan. Mungkinkah beberapa variabel lingkungan telah diubah?

Saya juga mencoba menghapus kutipan dari dalam variabel dengan berbagai upaya menggunakan perintah FOR. Tampaknya canggung dan saya tidak dapat mempelajari cara melakukannya dengan membuat daftar variabel untuk melakukan tugas:

sesuatu seperti ini:

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

Saya pikir saya memiliki dua masalah.

1) Ide 'singkat dan manis' saya untuk memasukkan ~ tilde dalam variabel% 1% 2 yang masuk (% ~ 1, dll) tampaknya telah memengaruhi beberapa pengaturan dan mengubah cara CMD menavigasi nama jalur yang panjang.

2) Saya masih mencari cara yang bersih dan mudah untuk menghilangkan tanda kutip dari variabel bernama yang dipilih.

Bantuan apa pun untuk mereka yang lebih berpengalaman akan sangat dihargai. Keterampilan saya sudah habis di sini ... mohon bantuannya!

edit 26/12/2009 13:36 PST seluruh file batch:

Blockquote
:: dataout.bat
:: revision 12/25/2009 tambahkan ~ tilde ke variabel% yang masuk untuk menghilangkan "tanda kutip" tertanam.
:: menulis daftar alamat menggunakan parameter baris perintah
:: menulis daftar keluaran data untuk QBooks IIF import
:: menulis Data Pesanan Pedagang untuk RUI
:: contoh string baris perintah untuk pengujian
:: listmail [firstname] [lastname] ["address string"] ["city string"] [state] [zip] [Order #] [PurchDate] [Regname] ["FirstName LastName"] [TransactionID] [PaymentMethod] [Total] [ProductID] [Jml] [Price_Each] [PackPrep] [Pengiriman] [CommissionPmt] [Faktur #]
:: contoh: 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:
cd \
cd documents dan settings \ administrator \ my documents \ txt \ batchtest
echo processing% 1% 2
: VARISET
::Ubah% n parameter baris perintah menjadi variabel string
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
shift
set ($ TransactionID) =% ~ 9
shift
set ($ PaymentMethod) =% ~ 9
shift
set ($ Total) =% ~ 9
shift set ($ ProductIdentifier) ​​=% ~ 9
shift
set ($ Quantity) =% ~ 9
shift
set ($ Price_Each) =% ~ 9
shift
set ($ Pack_Prep) =% ~ 9
shift
set ($ Shipping) =% ~ 9
shift
set ($ ServiceFee) =% ~ 9
shift
set ($ Discount) =% ~ 9
shift
set ($ Invoice) =% ~ 9
shift
set ($ UnitPrice) =% ~ 9
set _ShipCombName =% ($ FirstName)%% ($ LastName)%
nama kombo kapal echo adalah% _ShipCombName%
jeda
:: tulis string variabel ke logfile
echo FN% ($ FirstName)% LN% ($ LastName)% BA% ($ BillingAddress1)%% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)%% ($ OrderNumber)%% ($ Purch_Date)%% ($ RegistrationName)%% ($ TransactionID)%% ($ PaymentMethod)%% ($ Total)%% ($ ProductIdentifier)%% ($ Quantity)%% ($ Price_Each) %% ($ Pack_Prep)%% ($ Pengiriman)%% ($ ServiceFee)%% ($ Discount)%% ($ Invoice)%% ($ UnitPrice)%% _ShipCombName% >> d_out_log.txt
:: Tetapkan Akun oleh Penyedia Layanan
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _QBAcct = Amazon.com
:: 12-25-2009 menambahkan metode Amazon pm't kedua untuk keserbagunaan
IF / i% ($ PaymentMethod)% == Amazon SET _QBAcct = Amazon.com
JIKA / i% ($ PaymentMethod)% == SET MAST _QBAcct = Auth / Net
JIKA / 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)% == Pada SET Akun _QBAcct =% ($ RegistrationName)%
IF / i% ($ PaymentMethod)% == SET Surat _QBAcct =% ($ RegistrationName)%
IF / i% ( $ PaymentMethod)% == AMER SET _QBAcct = Auth / Net
IF / i% ($ PaymentMethod)% == DISC SET _QBAcct = Auth / Net
:: Tetapkan penunjuk Rep berdasarkan QBAccount
IF / i% ($ PaymentMethod)% == Amazon Receivables SET _Rep = Amazon
:: 12-25-2009 menambahkan metode Amazon pm't kedua untuk keserbagunaan
IF / i% ($ PaymentMethod)% == Amazon SET _Rep = Amazon
IF / i% ($ PaymentMethod)% == MAST SET _Rep = BlueZap
JIKA / i% ($ PaymentMethod)% == MasterCard SET _Rep = BlueZap
JIKA / i% ($ PaymentMethod)% == Visa SET _Rep = BlueZap
JIKA / i% ($ PaymentMethod)% == PayPal SET _Rep = BlueZap
JIKA / i% ($ PaymentMethod)% == SET Akun _Rep = RB
IF / i% ($ PaymentMethod)% == Mail SET _Rep = RB
IF / i% ($ PaymentMethod)% == AMER SET _Rep = BlueZap
JIKA / i % ($ PaymentMethod)% == DISC SET _Rep = BlueZap
:: periksa data alamat duplikat
findstr / i / s "% _ShipCombName%" addrlist.txt
echo errorlevel:% errorlevel%
jika errorlevel 1 goto: ADDRWRITE
jika errorlevel 0 goto: ADDRFOUND
: ALAMAT
echo% _ShipCombName% >> addrlist.txt
echo% ($ BillingAddress1)% >> addrlist.txt
echo% ($ BillingCity)%% ($ BillingState)%% ($ BillingPostal)% >> addrlist.txt
echo. >> addrlist.txt
echo Alamat File Ditulis
: ADDRFOUND
echo perwakilan yang dipilih adalah% _Rep%
akun yang dipilih echo adalah:% _QBAcct%
pause
:: RUI OUT
:: tulis ID Pesanan Pedagang & ID Pesanan RUI ke RUI
:: periksa data RUI duplikat di
cd writeRUI.txt ..
cd RegKOut
temukan / i "% ($ OrderNumber)%" writeRUI.txt
echo errorlevel:% errorlevel%
jika errorlevel 1 goto: RUIWRITE
jika errorlevel 0 goto: IIFWRITE
: RUIWRITE
echo% ($ Invoice)% % ($ OrderNumber)% >> writeRUI.txt
:: end tulis RUI
:: IIF OUT
: IIFWRITE
:: Periksa data faktur duplikat di writeIIF.txt
temukan / i "% ($ OrderNumber)%" writeIIF.txt
echo tingkat kesalahan :% errorlevel%
jika errorlevel 1 goto: HEADWRITE
jika errorlevel 0 goto: LINEWRITE
: HEADWRITE
:: tulis Header, Pengiriman / Penanganan, diskon, Rep & data komisi ke file impor QB IIF
echo% ($ OrderNumber)%% ($ Purch_Date)% Invoice% ($ TransactionID)%% _QBAcct% Account Receivable% ($ Total)%% _Rep % >> writeIIF.txt
echo H / P% ($ Pack_Prep)% 1? >> writeIIF.txt
echo SHP% ($ Pengiriman)% 1? >> writeIIF.txt
echo DISC% ($ Diskon)% 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
:: menulis harga diskon yang diurai dari variabel khusus:
echo% ($ ProductIdentifier) %% ($ Price_Each)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
: WRITE_DEFA
: menulis harga default yang diurai dari data Produk
echo% ($ ProductIdentifier)%% ($ UnitPrice)%% ($ Quantity)%? >> writeIIF.txt
goto: EOF
:: penundaan 3 detik
:: TYPE NUL | CHOICE.COM / N / CY / TY, 3> NUL
: EOF

BobB
sumber
Bisakah Anda menggunakan PowerShell untuk melakukan ini? Saya curiga Anda akan mendapatkan sedikit lebih banyak kendali jika Anda menggunakan PowerShell.
Robert Harvey
1
Saya memeriksa file batch Anda - tampaknya berfungsi dengan baik (setelah saya memperbaiki baris "set shift ($ ProductIdentifier) ​​=% ~ 9" - yang menurut saya, merupakan artefak dari menyalin-dan-menempel di sini).
atzz
Terima kasih Robert Harvey; Saya telah mengamati PowerShell. Saya tidak terlalu berpengalaman dengan pemrograman .. tidak yakin seperti apa kurva belajarnya. Saya memiliki beberapa pengalaman dengan file batch, alasan utama saya memilih ini. Saya bermaksud untuk mengkompilasi batch agar berjalan lebih cepat. Terima kasih atas tanggapannya.
BobB
Terima kasih atzz: Saya telah menguji file batch ini lagi dan saya cukup yakin bahwa ~ tilde dan tanda kutip banishing tidak berhubungan dengan masalah CMD dengan nama path yang panjang. Saya mengatasinya dengan hanya menyiapkan subdirektori nama pendek yang dekat dengan root untuk menghilangkan nama jalur yang panjang.
BobB
Tidak perlu menampilkan file batch lengkap. Harap persingkat pertanyaan Anda.
jor

Jawaban:

193

Anda memiliki tanda kutip ganda tambahan di bagian akhir, yang menambahkannya kembali ke akhir string (setelah menghapus kedua tanda kutip dari string).

Memasukkan:

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

Keluaran:

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

Catatan: Untuk mengganti Kutipan Ganda "dengan Kutipan Tunggal 'lakukan hal berikut:

set widget=%widget:"='%

Catatan: Untuk mengganti kata "Dunia" (tidak peka huruf besar-kecil) dengan BobB lakukan hal berikut:

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

Keluaran:

widget="Hello BobB!"

Sejauh pertanyaan awal Anda (simpan kode berikut ke file batch .cmd atau .bat dan jalankan):

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

Keluaran:

"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 . . .

%0adalah Nama dan Jalur Skrip.
%1adalah argumen baris perintah pertama, dan seterusnya.

Tuan Rick
sumber
Terima kasih, inilah yang saya kejar SET BathFileAndPath=%~0(sebenarnya, param array saya dimulai dengan 1 jadi saya menggunakanSET BathFileAndPath=%~1
Valamas
Bisakah Anda menjelaskan mengapa %widget:"=%menghilangkan tanda kutip?
CodyBugstein
4
@Imray - itu :old=newadalah pencocokan pola dan penggantian dalam ekspansi variabel. Dengan "as the olddan nothing as the new, tanda kutip akan dihapus, bahkan jika berada di tengah, bahkan jika tidak seimbang.
Jesse Chisholm
set widget =% widget: "=% memiliki perilaku aneh saat widget kosong, ia mengembalikan" = "
Rahul Misra
43

Kesimpulan Anda (1) terdengar salah. Pasti ada faktor lain yang berperan.

Masalah kutipan dalam parameter file batch biasanya diselesaikan dengan menghapus tanda kutip dengan %~dan kemudian menempatkannya kembali secara manual jika sesuai.

Misalnya:

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

"%cmd%" %params%

Perhatikan kutipan di sekitar %cmd%. Tanpa mereka, jalur dengan spasi tidak akan berfungsi.

Jika Anda dapat memposting seluruh kode batch Anda, mungkin jawaban yang lebih spesifik dapat dibuat.

atzz
sumber
1
Saya setuju; menurut saya set var =% ~ 1 seharusnya bekerja dengan baik. Saya akan memposting seluruh file batch seperti yang diminta.
BobB
Referensi MS: Menggunakan parameter batch . Siapa yang tahu ada begitu banyak modifikator? Sebagai referensi, dokumen MS resmi memberikan deskripsi %~1asExpands %1 and removes any surrounding quotation marks ("").
cod3monk3y
@ cod3monk3y Selain itu, mungkin juga untuk menanyakan cmddirinya sendiri tentang pengubah ini: call /?untuk bantuan tentang pengubah parameter, set /?untuk pengubah variabel (mungkin tidak terlalu intuitif). Cukup berguna.
atzz
12

Saya biasanya hanya menghapus semua kutipan dari variabel saya dengan:

set var=%var:"=%

Dan kemudian terapkan lagi di mana pun saya membutuhkannya, misalnya:

echo "%var%"
t1ck
sumber
Saya juga mengalami masalah dengan ini pada awalnya, ternyata saya melihat :sebagai .- setelah mencari tahu, bekerja tanpa hambatan. Tip bagus!
DaveU
9

Menghabiskan banyak waktu untuk mencoba melakukan ini dengan cara yang sederhana. Setelah melihat FOR loop dengan hati-hati, saya menyadari bahwa saya dapat melakukan ini hanya dengan satu baris kode:

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

Contoh:

@ECHO OFF
SET Quoted="Test string"

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

ECHO %Quoted%
ECHO %Unquoted%

Keluaran:

"Test string"
Test string
Vitaliy Ulantikov
sumber
Metode ini tidak relevan saat "SET Quoted = Test string". Pertanyaan selanjutnya adalah bagaimana membedakan apakah "(tanda kutip ganda) ada atau tidak. Kepada siapa yang berkepentingan, terima kasih sebelumnya.
Rhak Kahr
3

Ini terdengar seperti bug sederhana di mana Anda menggunakan% ~ di suatu tempat di mana Anda tidak seharusnya berada. Penggunaan jika% ~ tidak secara mendasar mengubah cara kerja file batch, ini hanya menghapus tanda kutip dari string dalam situasi tunggal tersebut.

John Knoeller
sumber
3

Saya belajar dari tautan ini , jika Anda menggunakan XP atau lebih tinggi, ini akan bekerja dengan sendirinya:

SET params = %~1

Saya tidak bisa mendapatkan solusi lain di sini untuk bekerja pada Windows 7.

Untuk mengulanginya, saya melakukan ini:

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

Catatan: Anda hanya akan mendapatkan tanda kutip ganda jika Anda menyampaikan argumen yang biasanya dipisahkan oleh spasi.


sumber
0
  1. set widget = "item yang sangat berguna"
  2. mengatur widget
  3. widget = "item yang sangat berguna"
  4. setel widget =% widget: "=%"
  5. mengatur widget
  6. set widget = item yang sangat berguna "

Kutipan tambahan "di baris 4 menambahkan kutipan "ke string. Ini harus dihapus. Sintaks untuk baris 4 diakhiri dengan%

David
sumber
@ user195488 - baca baris 3 seperti yang terlihat:widget="a very useful item" dan baca baris 6 seperti yang ditampilkan:widget=a very useful item" dan pahami bahwa baris 7 akan menjadi set widget=%widget:"=%dan baris 8 akan diamati bahwa baris yang ditampilkan widget=a very useful itemtidak lagi memiliki tanda kutip tambahan .
Jesse Chisholm
0

Saya pikir saya punya solusinya, tetapi saya segera mengalami perilaku yang tidak biasa dengan eksekusi file batch. Tiba-tiba CMD tidak mengenali pernyataan jalur panjang. Eksekusi normal file batch dari jalur lengkap

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

kembali

'C: \ Documents' tidak dikenali sebagai perintah internal atau eksternal ....

Itu semua masalahmu. CMD tidak memahami spasi di dalam nama file dari baris perintah, jadi CMD mengira Anda mencoba untuk lewat

dan Pengaturan \ Administrator \ Dokumen Saya \ Txt \ batchtest \ dataout.bat

sebagai parameter ke

"C: \ Documents"

program.

Anda perlu mengutipnya untuk menjalankan file batch dengan spasi di jalur:

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

akan berhasil.

CarryWise
sumber
0
@echo off

Setlocal enabledelayedexpansion

Set 1=%1

Set 1=!1:"=!

Echo !1!

Echo "!1!"

Set 1=

Mendemonstrasikan dengan atau tanpa tanda kutip tanpa memperhatikan apakah parameter asli memiliki tanda kutip atau tidak.

Dan jika Anda ingin menguji keberadaan parameter yang mungkin atau mungkin tidak dalam tanda kutip, letakkan baris ini sebelum echos di atas:

Jika '% 1' == '' goto yourub

Tetapi jika memeriksa keberadaan file yang mungkin atau mungkin tidak memiliki tanda kutip maka itu:

Jika ADA "! 1!" goto othersub

Perhatikan penggunaan tanda kutip tunggal dan tanda kutip ganda berbeda.

Aaron Lowe
sumber
0

Semua jawaban sudah lengkap. Tapi Ingin menambahkan satu hal,

setel FirstName =% ~ 1

setel LastName =% ~ 2

Baris ini seharusnya berfungsi, Anda perlu sedikit perubahan.

setel "FirstName =% ~ 1"

setel "LastName =% ~ 2"

Sertakan tugas lengkap dalam tanda kutip. Ini akan menghapus kutipan tanpa masalah. Ini adalah cara penugasan yang lebih disukai yang memperbaiki masalah yang tidak diinginkan dengan tanda kutip dalam argumen.

Nama Kode Jack
sumber
0

Sintaks tilde sederhana hanya berfungsi untuk menghapus tanda kutip di sekitar parameter baris perintah yang diteruskan ke file batch

SET xyz=%~1

Di atas kode file batch akan mengatur xyz ke nilai apa pun yang dilewatkan sebagai parameter pertama yang menghapus kutipan di depan dan di belakang (jika ada).

Namun, sintaks tilde sederhana ini tidak akan berfungsi untuk variabel lain yang tidak diteruskan sebagai parameter

Untuk semua variabel lainnya, Anda perlu menggunakan sintaks substitusi yang diperluas yang mengharuskan Anda menentukan karakter awal dan akhir yang akan dihapus. Secara efektif kami menginstruksikan untuk menghapus strip pertama dan karakter terakhir tanpa melihat apa itu sebenarnya.

@SET SomeFileName="Some Quoted file name"
@echo %SomeFileName% %SomeFileName:~1,-1%

Jika kita ingin memeriksa karakter pertama dan terakhir yang sebenarnya kutipan sebelum menghapusnya, kita memerlukan beberapa kode tambahan sebagai berikut

@SET VAR="Some Very Long Quoted String"
If aa%VAR:~0,1%%VAR:~-1%aa == aa""aa SET UNQUOTEDVAR=%VAR:~1,-1%
pengguna13490680
sumber