web-dev-qa-db-ja.com

Windowsの変数で空の文字列値を設定/使用する方法XP CMD.EXEコマンドライン?

SETを使用して空の値を変数に設定すると、Windows XP .CMDスクリプトでうまく機能します。ただし、同じSETコマンドは、コマンドラインから直接使用すると、同じCMDインタープリターで異なる動作をします。

CMD.EXEコマンドラインでそれをテストしようとしています:

C:\>set Q=

C:\>echo %Q%
%Q%

C:\>echo "%Q%"
"%Q%"

C:\>set Q=/Q

C:\>echo %Q%
/Q

C:\>echo "%Q%"
"/Q"

次のような.CMDスクリプトでテストしてみます。

set Q=
echo %Q%
echo "%Q%"
set Q=/Q
echo %Q%
echo "%Q%"

それを実行する:

C:\>c.cmd

C:\>set Q=

C:\>echo
ECHO is on.

C:\>echo ""
""

C:\>set Q=/Q

C:\>echo /Q
/Q

C:\>echo "/Q"
"/Q"

何が欠けていますか?

それはレドモンドからのいい冗談ですか、それともこの違いについての正気な説明はありますか?

コマンドラインで使用した場合に.CMDスクリプトの行が異なる動作をする場合、それらをテストするにはどうすればよいですか?

CMDコマンドラインで変数を空の文字列値に適切に設定する方法と、その変数を参照して空の文字列を取得するにはどうすればよいですか?

9
Laszlo Valko

tl; dr-echo %Q%echoに展開されるという問題があります。 echo.%Q%を使用

拡張された答え

echoコマンドには4つの動作があります:

  • echo on-コマンドのエコーを有効にします。
  • echo off-コマンドのエコーを無効にします。
  • echo-コマンドのエコーオプションの状態を表示します。
  • echo ...-...と改行を画面に表示します。

変数をechoに引数として渡し、それが空の場合、変数はechoに展開され、「ECHO is off」のようなものを表示します。

多くの人はecho.コマンドを使用して空の文字列(read:output newline)を表示しますが、echo.を使用して出力動作を明示的に指定できることを誰もが知っているわけではありません。例えば。:

  • echo.on-onと改行を出力します
  • echo.off-offと改行を出力します
  • echo.-改行を出力します
  • echo.something-somethingと改行を出力します
  • echo.%Q%-「 "/" on "/" off "かどうかに関係なく、%Q%の内容を出力します。

.と引数の間にはスペースを入れないでください。

https://technet.Microsoft.com/en-us/library/bb490897.aspx?f=255&MSPPError=-2147217396 を参照してください

6
Egor305

私のスクリプトでもまったく同じ問題に遭遇しました。現在、変数を空の文字列に設定する方法が見つかりませんでした。私はそれを1つのスペースで初期化する方法を見つけました:

set "Var= "

これらの引用符はオプションです。しかし、それらは実際にそのスペースを明示的に確認し、端末の空白のクリーンアップ手順の場合にそれを保持するのに役立ちます。

ここで見つけることができる詳細情報: SETコマンド

4
Victor Yarema

変数が空であるかどうかを確認できますが、concatenate変数を空/ null値をサポートする文字列にしたい場合、可能な回避策はprefixです。 =ダミー文字を含むすべての値、およびskipこの変数を使用する場合は常にこの文字:

set q=0
set q2=%q:~1%string

テスト:

set q=0_
echo %q%
echo %q:~1%concat%q:~1%

set q=0
echo %q%
echo %q:~1%concat%q:~1%

結果は、最初のケースでは_concat_、2番目のケースではconcatになります。

2
Ogmios

@Laszlo Valko:どのCPを使用するかは言いませんが、少なくともCP 437では「見えない」文字であるAlt-255を使用して空の変数を「偽造」します。

@echo off
::The line below contains the invisible character (Alt-255)
echo Q set to "Invisible"
set Q= 
set Q
echo %Q%
echo "%Q%"
echo Q set to Empty
set Q=
set Q
echo %Q%
echo "%Q%"
echo Q set to "/Q"
set Q=/Q
set Q
echo %Q%
echo "%Q%"

SET Qを使用すると、Qで始まるすべての変数が表示されます。SET Cを試してみれば、私の意味がわかります。ご覧のとおり、変数が空白に設定されている場合、その変数は削除されます。 ECHO %Q%を実行すると、コマンドインタープリターはECHOと言っていると見なし、状態(オンまたはオフ)を通知します。スクリプトの冒頭で@echo offを使用したため、エコーがオフであると報告されています。

お役に立てば幸いです。

1
JSanchez