3 つのデータを入力するバッチ ファイルを作成し、そのデータを使用して別のバッチ ファイルを作成しようとしています。作成して停止するだけです。バッチは、方法がわからないユーザーのために、いくつかのネットワーク ドライブをマップします。
「master.bat」があり、メモ帳を使用して「置換」を使用して「ユーザー名」、「パスワード」、「ドライブパス」を入力しています。「master.bat」に変数を入力して、そのユーザーの「custom.bat」を作成しようと思いました。
ここで最後のステップにたどり着くのに多くの助けを得ました。最後の部分を除いてすべてが機能しています。すべての変数とそれらを配置するためのテンプレートが用意できたので、
2 に答える
1つの方法は、テンプレートをファイル形式で使用し、その中のプレースホルダーを実際の値に置き換えることです。
setlocal enabledelayedexpansion
for /f %%L in (template.cmd) (
set "Line=%%L"
set "Line=!Line:[username]=!username!"
...
>network-drives.cmd echo !Line!
)
[username]
これは、テンプレートおよび定義された対応する変数のようなプレースホルダーを前提としています。
ただし、ファイルから読み取ったデータをまとめて使用すると、いつも少し不安になります。最近、別のファイルからバッチファイルを作成する必要があったとき、次のルートを使用しました。
(
echo @echo off
echo net use !drivepath! \\server\share "/user:!username!" "!password!"
echo net use !drivepath2! \\server\share2 "/user:!username!" "!password!"
) > network_drives.cmd
生成されたバッチファイルで必要になる可能性のある構文のために予約されている括弧やいくつかの文字などに注意する必要があります。しかし、このアプローチは、維持するのが少し難しいですが、完全に自己完結型です。
テンプレートをバッチ ファイルに埋め込むのは簡単です。これを行うには複数の方法があります。1 つは、単純に各テンプレート行の前に:::
. このシーケンスを選択した:
のは、既にバッチ ラベルとして::
使用されており、バッチ コメントとして頻繁に使用されているためです。
遅延展開を使用して、検索と置換を自動的に行うことができます!
出力に含める必要がある特殊文字は 3 つだけです。これらの特殊文字は、おそらく元の質問には必要ありません。しかし、一般的な意味でそれらを処理する方法を知っておくとよいでしょう。
感嘆符リテラル!
は、エスケープするか置換する必要があります
キャレット リテラル^
は、感嘆符のある行に表示される場合、エスケープまたは置換できます。ただし、行に感嘆符がない場合は、エスケープしてはなりません。キャレット置換は常に安全です。
置換を使用して行を開始します:
@echo off
setlocal
::The following would be set by your existing script code
set drivePath=x:
set username=rumpelstiltskin
set password=gold
::This is only needed if you want to include ! literals using substitution
set "X=!"
::This is only needed if you want to include ^ literal on same line
::containing ! literal
set "C=^"
::This is only needed if you want to start a line with :
set ":=:"
::This is all that is needed to write your output
setlocal enableDelayedExpansion
>mapDrive.bat (
for /f "tokens=* delims=:" %%A in ('findstr "^:::" "%~f0"') do @echo(%%A
)
::----------- Here begins the template -----------
:::@echo off
:::net use !drivePath! \\server\share "/user:!username!" "!password!"
:::!:!: Use substitution to start a line with a :
:::!:!: The following blank line will be preserved
:::
:::echo Exclamation literal must be escaped ^! or substituted !X!
:::echo Caret with exclamation must be escaped ^^ or substituted !C!
:::echo Caret ^ without exclamation must not be escaped