it-swarm-ja.com

バッチファイルを使用して、%username%を含む別のバッチファイルを作成するにはどうすればよいですか。

別のバッチファイルを使用してバッチファイルを作成しようとしています。
他のコンピューターでも機能させるには、作成するファイルに%username%が含まれている必要があります。
これを実行しようとすると、ファイルに実際のユーザー名が入力されるため、他のコンピューターで実行できなくなります。誰かが私の問題を手伝ってくれませんか?

これが私がバッチファイルに書いたものです:

Echo cd c:\Users\%username%\Documents > x.bat

しかし、x.batを開くと、次のように表示されます。

Echo cd c:\Users\myname\Documents

私は実際にこの問題の原因を知っていますが、それを乗り越える方法を見つけることができませんでした。

2
Ali Demir

一部の賢い人々は、この stackoverflow.com Q&Aでバッチファイルを処理するcmd.exeの内部動作を調べました。

%をエスケープするには、2倍にする必要があります
(上記のリンクは、これがバッチパーサーによって早期に取り消されるステップであることを説明しています)

%を含む変数を繰り返し設定してエコーする場合は、拡張を遅らせるために、関連するすべてのステップで2倍にする必要があります%-> %%-> %%%%

関連する問題delayedexpansionには2つの解決策があります。

  1. Setlocal EnableDelayedExpansion および!の代わりに%を使用します。
    これは、(コードブロック)で変数を設定して使用する場合に必要です。
  2. 2番目の評価パスを強制するためのsetまたはechoコマンドでの疑似呼び出しの使用。
    (たとえば、変数を間接的に参照するため)

例:

:: Q:\bar\2018\06\22\SU_1333415.cmd
@Echo off
( Echo cd c:\Users\%username%\Documents
  Echo random number %random%
) >x.bat 
Echo============x.bat=============
type x.bat
Echo=
( Echo cd c:\Users\%%username%%\Documents
  Echo random number %%random%%
) >y.bat 
Echo============y.bat=============
type y.bat
Echo=
Echo ========call echo============
Set bar=6
Set foo=bar
Call Echo foo = %foo%, %%foo%% = %%%foo%%%
Echo=
Echo =====delayed expansion !===
Setlocal EnableDelayedExpansion
Set bar=6
Set foo=bar
Echo foo = %foo%, !foo! = !%foo%!
Echo=
Echo =======(code block)==========
Set "Answer=n/a"
( Set /P "Answer=Enter a number: "
       Echo 1. the Answer is [%Answer%]
  Call Echo 2. the Answer is [%%Answer%%]
       Echo 3. the Answer is [!Answer!]
)
Echo==============================

サンプル出力:

20:07:57 Q:\Test\2018\06\22
> SU_1333415.cmd
===========x.bat=============
cd c:\Users\LotPings\Documents
random number 5680

===========y.bat=============
cd c:\Users\%username%\Documents
random number %random%

========call echo============
foo = bar, bar = 6

=====delayed expansion !===
foo = bar, bar = 6

=======(code block)==========
Enter a number: 11
1. the Answer is [n/a]
2. the Answer is [11]
3. the Answer is [11]
=============================
2
LotPings