私の問題: さまざまな 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」を削除します。