システム変数を別の変数内に渡す

システム変数を別の変数内に渡す

私の問題: さまざまな engrg リソースを指す特定のアイコンをユーザーのデスクトップにコピーする必要があります。これらのアイコンは、ある程度定期的に更新されます。私の最初のバッチ ファイルは、単にrobocopyこれを実行するためだけに使用されており、完璧に機能していました。

robocopy "[NetworkDrive]\folderX\Desktop" "%userprofile%\Desktop"

少なくともほとんどの人にとってはそうでした。Office365 と OneDrive を展開すると、ユーザーはデスクトップを同期します。この場合、%userprofile%\desktop はデスクトップの場所ではありません。まったく別のものです。

c:\users\username\one_drive_enterprise_name\Desktop

そこで私はバッチを次のように調整しました:

set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"

set VALUE_NAME="Desktop"

FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B

echo "%LUD%"

robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"

%LUD%指定されたユーザーに適切なキーを返します。

または%userprofile%\desktop"c:\users\username\one_drive_enterprise_name\Desktop."

しかし、robocopy 内で渡すと%LUD%、リテラル パスとして取得され、バッチ ファイルの現在の場所がプレフィックスとして付加されます。

例として、c:\users\current user\desktop\userprofile\desktop です。

デスクトップに %userprofile% という新しいフォルダーが作成され、その中に Desktop というサブフォルダーが作成されます。 :)

単純なハードコードされたパスで別の If>Then を使用して適切なものを渡すにはどうすればよいですか?

ありがとう、ケビン

答え1

問題は、変数の値に別の変数を参照するための文字LUDが含まれていることです。%

もっと効率的な方法があるかもしれませんが、次のようにすることができます。

echo set folder=%LUD% > "%TEMP%\setfolder.bat"
call "%TEMP%\setfolder.bat"
del "%TEMP%\setfolder.bat"
echo %folder%

答え2

次のようにすれば問題は解決するはずです。変数自体ではなく、%LUD% 内の変数の内容を取得します。

/f "delims=" %%a in ('echo %LUD%') の場合、LUD=%%a を設定します

@echo off
set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"

set VALUE_NAME="Desktop"

FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B

for /f "delims=" %%a in ('echo %LUD%') do set LUD=%%a

robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"

答え3

同僚と話してみると、他に 2 つの選択肢があることがわかりました...

1 - 全員にパブリックデスクトップを使用して、それで終わりにします。C:\users\public\desktop

2 - 「User Shell Folder」の代わりに「Shell Folder」キーを使用します。なぜでしょうか? 「shell folder」キーには実際のパスのみが保持され、変数は保持されないためです。つまり、KEY_NAME から「user」を削除します。

関連情報