0

Windows でユーザーのデスクトップ フォルダーを検索するバッチ ファイルを作成しました。

for /F "skip=2 tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%a

デスクトップ フォルダが にない場合でも、C:\Users\User\Desktop動作して正しいフォルダを返します。たとえば、私の場合はE:\User\Desktop. デスクトップ フォルダが にある場合、C:\Users\User\Desktop上記のスクリプトは%USERPROFILE%\Desktop. スクリプトの後半で、デスクトップに新しいファイルを作成しようとします。最初のオプションでE:\User\Desktopは、実際のディレクトリであるため機能します。2番目のものでは、明らかに%USERPROFILE%\Desktopディレクトリとしてカウントされないため、そうではありません。

echo start javaw -jar "path/to/program.jar" >"%DESKTOP%\Start program.bat"

両方の状況で動作させるにはどうすればよいですか?

やっている

if /I "%DESKTOP%" EQU "%USERPROFILE%\Desktop"

と同じなので役に立ちません。

if /I "%DESKTOP%" EQU "C:\Users\User\Desktop"
4

2 に答える 2

2

call変数を展開するために使用できます。
call set desktop=%desktop%

于 2012-10-06T15:39:41.830 に答える
2

通常の展開の追加ラウンドが必要です。wmz が既に回答しているように、CALL を使用して余分なラウンドを取得できます。

フォルダ名やファイル名で有効な&や などの特殊文字に注意する必要があります。^特殊文字を保護するために、課題では引用符を使用することをお勧めします。

call set "DESKTOP=%DESKTOP%"

DESKTOP の値にはまだ引用符が含まれていないと想定しています。引用符を含む定義と含まない定義が混在している場合、すべての賭けは無効になります。

と仮定DESKTOP=This & that\%VAR%VAR=& the other thingます。CALL を使用した引用符で囲まれた代入の最終結果は正しいものになります: This & that\& the other thing.

&現実の世界でフォルダー名を見たことがあるので、引用符は良いことです。ただし、値に が含まれている場合は問題があります^^CALL を介して渡された場合、引用符は 2 倍になります。

と仮定するDESKTOP=one^two%var%VAR=^three、CALL を使用した引用符で囲まれた代入の最終結果は になりますone^^two^three

^フォルダー名に出くわしたことはないと思いますが、可能であり、解決策があります。CMD /C を使用して展開の別のラウンドを取得し、FOR /F を使用して結果をキャプチャできます。

以下は の正しい結果を与えますone^two^three。私が使用する"eol=:"のは、有効なパスが で始まることは決してないためです:

for /f "eol=: delims=" %%B in ('cmd /c echo "%DESKTOP%"') do set "DESKTOP=%%~B"

DESKTOP の中間割り当てを使用する必要はありません。上記のすべてで、 FOR /F%%aを の代わりに使用できます%DESKTOP%

于 2012-10-06T16:39:47.243 に答える