web-dev-qa-db-ja.com

Windowsバッチファイルの文字列から最初と最後の文字を削除する

Windowsバッチファイル内に次の文字列があります。

"-String"

文字列には、上記のように、文字列の最初と最後に2つの引用符も含まれています。

次の文字列を取得できるように、最初と最後の文字を削除したいと思います。

-String

私はこれを試しました:

set currentParameter="-String"
echo %currentParameter:~1,-1%

これにより、文字列が次のように出力されます。

-String

しかし、編集した文字列をこのように保存しようとすると、失敗します。

set currentParameter="-String"
set currentParameter=%currentParameter:~1,-1%
echo %currentParameter%

何も印刷されません。私は何を間違えますか?


これは本当に奇妙です。このように文字を削除すると、次のように機能します。

set currentParameter="-String"
set currentParameter=%currentParameter:~1,-1%
echo %currentParameter%

印刷されます:

-String

しかし、実際には私のバッチはもう少し複雑で、そこでは機能しません。私がプログラムしたものを示します:

@echo off

set string="-String","-String2"

Set count=0
For %%j in (%string%) Do Set /A count+=1


FOR /L %%H IN (1,1,%COUNT%) DO ( 

    echo .
        call :myFunc %%H
)
exit /b

:myFunc
FOR /F "tokens=%1 delims=," %%I IN ("%string%") Do (

    echo String WITHOUT stripping characters: %%I 
    set currentParameter=%%I
    set currentParameter=%currentParameter:~1,-1%

    echo String WITH stripping characters: %currentParameter% 

    echo .

)
exit /b   

:end

そして、出力は次のとおりです。

.
String WITHOUT stripping characters: "-String"
String WITH stripping characters:
.
.
String WITHOUT stripping characters: "-String2"
String WITH stripping characters: ~1,-1
.

しかし、私が欲しいのは:

.
String WITHOUT stripping characters: "-String"
String WITH stripping characters: -String
.
.
String WITHOUT stripping characters: "-String2"
String WITH stripping characters: -String2
.
10
Metalhead89

括弧で囲まれたブロック内の変数を変更しています。注意してください-新しい値は同じブロック内で使用されません(変数を%ではなく!で区切って、enabledelayedexpansionモードで実行しない限り)。または、()を挿入した単純な行のシーケンスを使用して、2行を別のサブ関数に抽出します。

挨拶、Stach

4
Stach

希望があなたを助けるでしょう。文字を削除せずに文字列をエコーする:%% I

set currentParameter=%%I
set currentParameter=!currentParameter:~1,-1!

echo String WITH stripping characters: !currentParameter! 

echo .

それはうまくいくかもしれません。これを一度試してください。

4
phani

このスクリプトは、ENABLEDELAYEDEXPANSIONを利用します。わからない場合は、バッチスクリプトがforおよびifコマンドをすべて1つに実行します。したがって、次の場合:

if true==true (
@echo off
set testvalue=123
echo %testvalue%
pause >NUL
)

Echo%testvalue%が実行されたときに、testvalueが変更されたことを認識しないため、何も出力されません。 delaydexapnsionを使用すると、スクリプトはその値を現在の状態で読み取ることができ、前に述べた問題を忘れることができます。 %testvalue%と同じように使用しますが、!testvalue!を実行することもできます。これを修正するには:

if true==true (
@echo off
set testvalue=123
echo !testvalue!
pause >NUL
)
  • 123をエコーし​​ます。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set string="-String","-String2"
Set count=0

For %%j in (%string%) Do Set /A count+=1

FOR /L %%H IN (1,1,%COUNT%) DO ( 
echo .
call :myFunc %%H
)

exit /b
:myFunc

FOR /F "tokens=%1 delims=," %%I IN ("%string%") Do (
echo String WITHOUT stripping characters: %%I 
set currentParameter=%%I
set currentParameter=!currentParameter:~1,-1!
echo String WITH stripping characters: !currentParameter! 
echo .
)

exit /b   
:end

〜アレックス

3
Alex Lindstrom

同様の問題がありましたが、Ex:set FileName =%Name:〜0,11%の間にスペースを削除することで解決しました# '='の前後にスペースがありませんEx:set FileName =%Name:〜0,11%#Not OR after '='の後のスペースとして機能する

したがって、スペースを削除してみてください。機能するはずです。注:バックグラウンド値を更新するには、コマンドラインを再度開く必要があります。そうしないと、一時的に保存されているのと同じ出力が表示されます。

0
Ramgopal