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
sumber
Jawaban:
Anda memiliki tanda kutip ganda tambahan di bagian akhir, yang menambahkannya kembali ke akhir string (setelah menghapus kedua tanda kutip dari string).
Memasukkan:
Keluaran:
Catatan: Untuk mengganti Kutipan Ganda "dengan Kutipan Tunggal 'lakukan hal berikut:
Catatan: Untuk mengganti kata "Dunia" (tidak peka huruf besar-kecil) dengan BobB lakukan hal berikut:
Keluaran:
Sejauh pertanyaan awal Anda (simpan kode berikut ke file batch .cmd atau .bat dan jalankan):
Keluaran:
%0
adalah Nama dan Jalur Skrip.%1
adalah argumen baris perintah pertama, dan seterusnya.sumber
SET BathFileAndPath=%~0
(sebenarnya, param array saya dimulai dengan 1 jadi saya menggunakanSET BathFileAndPath=%~1
%widget:"=%
menghilangkan tanda kutip?:old=new
adalah pencocokan pola dan penggantian dalam ekspansi variabel. Dengan"
as theold
dan nothing as thenew
, tanda kutip akan dihapus, bahkan jika berada di tengah, bahkan jika tidak seimbang.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:
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.
sumber
%~1
asExpands %1 and removes any surrounding quotation marks ("").
cmd
dirinya sendiri tentang pengubah ini:call /?
untuk bantuan tentang pengubah parameter,set /?
untuk pengubah variabel (mungkin tidak terlalu intuitif). Cukup berguna.Saya biasanya hanya menghapus semua kutipan dari variabel saya dengan:
Dan kemudian terapkan lagi di mana pun saya membutuhkannya, misalnya:
sumber
:
sebagai.
- setelah mencari tahu, bekerja tanpa hambatan. Tip bagus!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:
Contoh:
Keluaran:
sumber
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.
sumber
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:
Catatan: Anda hanya akan mendapatkan tanda kutip ganda jika Anda menyampaikan argumen yang biasanya dipisahkan oleh spasi.
sumber
Kutipan tambahan
"
di baris 4 menambahkan kutipan"
ke string. Ini harus dihapus. Sintaks untuk baris 4 diakhiri dengan%
sumber
widget="a very useful item"
dan baca baris 6 seperti yang ditampilkan:widget=a very useful item"
dan pahami bahwa baris 7 akan menjadiset widget=%widget:"=%
dan baris 8 akan diamati bahwa baris yang ditampilkanwidget=a very useful item
tidak lagi memiliki tanda kutip tambahan .Itu semua masalahmu. CMD tidak memahami spasi di dalam nama file dari baris perintah, jadi CMD mengira Anda mencoba untuk lewat
sebagai parameter ke
program.
Anda perlu mengutipnya untuk menjalankan file batch dengan spasi di jalur:
akan berhasil.
sumber
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.
sumber
Semua jawaban sudah lengkap. Tapi Ingin menambahkan satu hal,
Baris ini seharusnya berfungsi, Anda perlu sedikit perubahan.
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.
sumber
Sintaks tilde sederhana hanya berfungsi untuk menghapus tanda kutip di sekitar parameter baris perintah yang diteruskan ke file batch
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.
Jika kita ingin memeriksa karakter pertama dan terakhir yang sebenarnya kutipan sebelum menghapusnya, kita memerlukan beberapa kode tambahan sebagai berikut
sumber