8

変数名を含む文字列を受け入れるバッチ ファイルを実行しようとしています。その後、変数はバッチ ファイルで使用されます。例えば...

C:\>test.bat user%num%

バッチファイルで...

set num=1
(This is where I need help... Somehow set domainusername=user1)
echo %domainusername%

set num=2
...

アイデアは、変数名がどこにあるかに関係なく、バッチ呼び出しが同じように機能できるようにすることです。例..

C:\>test.bat %num%user
or
C:\>test.bat us%num%er

編集:
私はすでにこの作業を行うためにかなりの量の調査を行ってきました。私が試した中で最も有望なアイデアは、(例の) %1 を再帰的に評価する for ループでした。残念ながら、私はそれを機能させることができませんでした。うまくいけば、これは他の人にいくつかのアイデアを引き起こします.

4

4 に答える 4

6

コード:

@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%

出力:

user1
于 2012-04-19T17:31:46.083 に答える
4

OPを理解しているので、Aaciniとstackoverflowの答えは間違っています。

num(Aacini の) 遅延拡張ソリューションは、バッチを開始する前に が定義されている場合にのみ機能し、それ以外の%mnm%場合は拡張しません。

C:\>set "num="

C:\>myBatch.bat user%num%

の出力への結果
user%num%

(stackoverflow の) 他の解決策は少しうまく機能しますが、が定義されていると失敗しますnum

set num=2私はそれを示すために秒を追加しました

@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%

set num=2
CALL SET x=%param%
ECHO %x%

2回呼び出すと問題が表示されます

C:\>myBatch user%num%
user1
user2

C:\>myBatch user%num%
user2
user2

2 回目の実行2では、バッチの開始時に結果が修正されるため、2 回取得しました。

format-stringが実際に存在するかどうか、またはが既に展開され ているかどうか%1を確認するために、 の内容をエコーすることをお勧めします。%num%

OPを理解しているので(理解していない可能性があります!)、質問はプレースホルダーの使用に関するものです
が、これはコマンドラインでのみ機能し(別のバッチからではなく)、パーセントでのみ機能するため、注意が必要ですその時点で変数が定義されていない場合に機能します。
変数が定義されている場合、 は%num%すぐに展開され、その内容は%1isuser2と not user%num%(num=2 と仮定) になるためです。

ときどき機能するのは、cmd-line パーサーの副作用にすぎません。未定義の変数 (バッチ ファイル内のように) を削除しないためです。代わりに、未定義の変数の展開はまったく変更されません。

echo "%thisIsUndefined%"  - from cmd-line this outputs `"%thisIsUndefined%"`
echo "%thisIsUndefined%"  - from a batch file this outputs `""`

ただし、副作用として、コマンド ライン コンテキストでパーセント記号をエスケープする方法はありません。疑似エスケープ
の回避策しかありません。 パーセントを実際にエスケープするわけではありませんが、ほとんどの場合、という名前の変数は存在しません。
mybatch user%num^%
num^

次に、stackoverlow のソリューションは次のように機能します。

myBatch user%num^%

しかし、私はAaciniが言及した遅延拡張を好みます.
次に、パーセントの代わりに感嘆符を使用してバッチを呼び出します。通常、遅延拡張はデフォルトで無効になっているため、これはうまく機能します。

myBatch user!num!

バッチ自体は次のようになります

@echo off
set "param=%1"
Setlocal EnableDelayedExpansion
set num=1
echo %param%
set num=2
echo %param%
于 2012-04-21T20:43:55.023 に答える
1

すみません。私はあなたが何を望んでいるのか本当に理解していないと思います。でも...

変数の名前をバッチファイルに渡す場合は、次の方法でその変数に直接値を割り当てることができます。

set %1=Any value

このような変数の値を取得する場合は、遅延拡張を使用する必要があります。setlocal EnableDelayedExpansion最初にコマンドを挿入し、変数名(%1パラメーター)を感嘆符で囲みます。

setlocal EnableDelayedExpansion
set varValue=!%1!

あなたの場合、私はあなたがこのような何かを達成したいと思うと思います:

set num=1
set domainusername=!user%num%!
echo %domainusername%

しかし、これはあなたが言ったように%1パラメータを使用しないので、私にはわかりません...

お役に立てば幸いです...

編集:おそらくこの投稿はあなたに役立つかもしれません...

補遺:OPが何を望んでいるかを理解した後、これが私の解決策です。

@ECHO off
setlocal EnableDelayedExpansion
SET param=%1
SET num=1
SET x=!param!
ECHO %x%

遅延拡張は、CALLよりも高速に実行されます。

于 2012-04-19T16:53:34.653 に答える
0

後付けとして、その変数が実際にそこにあると判断する前に、その変数をテストすることを検討してください。これをプログラムの先頭に追加します。

if %1.==. goto :usage_orwherever
于 2012-04-19T20:45:19.087 に答える