[解決済み] バッチファイル内の変数から二重引用符を削除するとCMD環境に問題が発生する
質問
バッチ変数から引用符を削除する効果的で安全な方法について、どなたか教えていただけませんか?
私は、パラメータ %1、%2、%3 などのリストを正常にインポートし、それらを名前付き変数に配置するバッチ ファイルを書きました。 これらのパラメーターのいくつかは、複数の単語を含んでおり、そのため二重引用符で囲まれています。
> "Susie Jo" (%1)
> "Smith Barnes" (%2)
> "123 E. Main St." (%3)
これらの%変数は、次に名前付き変数に置かれます。
> set FirstName=%1
> set LastName=%2
> set ShipAddr=%3
変数の検証はechoで行います。
> echo.%FirstName%。
> echo.%LastName%。
> echo.%ShipAddr%。
のように表示されます。
"Susie Jo"
"Smith Barnes"
"123 E. Main St."
選択された変数に含まれる引用符を除去する必要があります。 例えば、FirstNameとLastNameは他の場所で使用され、引用符を含んではいけません。
テスト バッチ ファイルで、私は変数内の ~tilde 文字を使用して引用符を除去することに成功しました。
> set FirstName=%~1
> set LastName=%~2
解決したと思ったのですが、すぐにバッチファイルの実行で異常な動作が発生しました。 突然、CMD が長いパス ステートメントを認識しなくなりました。 フルパスからのバッチ ファイルの正常な実行
> C:\Documents and Settings\Administrator\My Documents\Txt\batchtest\dataout.bat
リターン
> 'C:\Documents' is not recognized as an internal or external command....
ということは、入力される %1 %2...%n 変数に ~tilde 文字が追加されたことで、何らかの変更が発生したようです。 もしかしたら、いくつかの環境変数が変更されたのでしょうか?
私はまた、FOR コマンドを使用して、さまざまな試みで、変数内の引用符を消去しようとしました。 これは厄介なようで、タスクを実行するために変数のリストを作成することによってこれを達成する方法を学ぶことができませんでした。
このようなものです。
for %%g in (%FirstName% %LastName%) do (
set %%g=%%~g
set %%h=%%~h
set FirstName=%%~g
set LastName=%%h
echo.%FirstName% %LastName%
)
2つの問題があると思います。
-
入力される %1 %2 変数 (%~1 など) に ~tilde を挿入するという私の「短くて甘い」考えは、いくつかの設定に影響を与え、CMD が長いパス名をナビゲートする方法を変更したようです。
-
私はまだ、選択された名前付き変数から引用符を除去するクリーンで簡単な方法を探しています。
より経験豊富な人のためのどんな助けでも、最も感謝されるでしょう。 私はここで私のスキルの終わりにいます...いくつかの指導をお願いします!
編集 2009年12月26日 13:36 PST バッチファイル全体です。
:: dataout.bat
:: revision 12/25/2009 add ~tilde to incoming %variables to eliminate embedded "quotation marks.
:: writes address list using command line parameters
:: writes data output list for QBooks IIF import
:: writes Merchant Order data for RUI
:: sample command line string for testing
:: listmail[firstname][lastname]["address string"]["city string"][state][zip][Order#][PurchDate][Regname]["FirstName LastName"][TransactionID][PaymentMethod][Total][ProductID][Qty][Price_Each][PackPrep] [Shipping] [CommissionPmt] [Invoice#]
:: example: 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 and settings\administrator\my documents\txt\batchtest
echo processing %1 %2
:VARISET
:: Convert %n command line parameters to string variables
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)%
echo ship combo name is %_ShipCombName%
pause
:: write string varibables to logfile
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
:: Assign Account by Service Provider
IF /i %($PaymentMethod)%==Amazon Receivables SET _QBAcct=Amazon.com
:: 12-25-2009 added second Amazon pm't method for versatility
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)%==On Account 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
:: Assign Rep designator based on QBAccount
IF /i %($PaymentMethod)%==Amazon Receivables SET _Rep=Amazon
:: 12-25-2009 added second Amazon pm't method for versatility
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)%==On Account 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
:: check for duplicate address data
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
echo. >> addrlist.txt
echo Address File Written
:ADDRFOUND
echo selected rep is %_Rep%
echo selected account is: %_QBAcct%
pause
:: RUI OUT
:: write Merchant Order ID & RUI Order ID to RUI
:: check for duplicate RUI data in 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 %($Invoice)% %($OrderNumber)% >> writeRUI.txt
:: end write RUI
:: IIF OUT
:IIFWRITE
:: Check for duplicate invoice data in writeIIF.txt
find /i "%($OrderNumber)%" writeIIF.txt
echo errorlevel: %errorlevel%
if errorlevel 1 goto :HEADWRITE
if errorlevel 0 goto :LINEWRITE
:HEADWRITE
:: write Header, Ship/Handling, discount, Rep & commission data to QB IIF import file
echo %($OrderNumber)% %($Purch_Date)% Invoice %($TransactionID)% %_QBAcct% Accounts Receivable %($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
::writes discounted prices parsed from custom variable:
echo %($ProductIdentifier)% %($Price_Each)% %($Quantity)% ? >> writeIIF.txt
goto :EOF
:WRITE_DEFA
:writes default prices parsed from Product data
echo %($ProductIdentifier)% %($UnitPrice)% %($Quantity)% ? >> writeIIF.txt
goto :EOF
:: 3-second delay
:: TYPE NUL | CHOICE.COM /N /CY /TY,3 >NUL
:EOF
どのように解決するのですか?
最後に余分なダブルクォートがあるため、(文字列から両方のクォートを削除した後)文字列の最後に追加されています。
入力です。
set widget="a very useful item"
set widget
set widget=%widget:"=%
set widget
出力します。
widget="a very useful item"
widget=a very useful item
注)ダブルクォート "をシングルクォートに置き換えるには、以下のようにします。
set widget=%widget:"='%
注: "World"という単語(大文字小文字を区別しない)をBobBに置き換えるには、次のようにします。
set widget="Hello World!"
set widget=%widget:world=BobB%
set widget
出力します。
widget="Hello BobB!"
最初の質問に関しては、以下のコードをバッチファイル .cmd または .bat に保存して実行してください)。
@ECHO OFF
ECHO %0
SET BathFileAndPath=%~0
ECHO %BathFileAndPath%
ECHO "%BathFileAndPath%"
ECHO %~0
ECHO %0
PAUSE
出力します。
"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
はスクリプト名とパスです。
%1
はコマンドラインの第1引数で、以下同様です。
関連
-
[解決済み】LaTeXで変数を定義する方法はありますか?
-
[解決済み] JenkinsでGroovyの変数を表示するには?
-
[解決済み] レジストリキーの値を取得し、powershellを使用して値をONLYする方法
-
[解決済み] キーと値のペアのファイルから環境変数を設定する
-
[解決済み] Windowsのコマンドプロンプトから環境変数を更新するコマンドはありますか?
-
[解決済み】バッチファイルやcmdファイルによるサービスの停止と開始は?
-
[解決済み】バッチファイルから空のテキストファイルを作成する方法は?
-
[解決済み】Windowsのバッチファイルからシステム環境変数を設定する?
-
[解決済み] Makefile で複数行の文字列変数を作成することは可能ですか?
-
[解決済み] バッチファイル内の変数から二重引用符を削除するとCMD環境に問題が発生する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LaTeXで変数を定義する方法はありますか?
-
[解決済み] Makefileの変数の初期化とエクスポート
-
[解決済み] Rustタイプにおけるアンパサンドの意味は?
-
[解決済み] JenkinsでGroovyの変数を表示するには?
-
[解決済み] PowerShellで変数が8文字以上であることをテストするにはどうすればよいですか?
-
[解決済み] レジストリキーの値を取得し、powershellを使用して値をONLYする方法
-
[解決済み】コマンドラインでansible playbookに変数を渡すにはどうすればよいですか?
-
[解決済み] 変数 "i "と "j "はなぜカウンタに使われるのですか?
-
[解決済み] Makefile で複数行の文字列変数を作成することは可能ですか?
-
[解決済み] バッチファイル内の変数から二重引用符を削除するとCMD環境に問題が発生する