如何将“AppData\Roaming”重定向到子目录以使应用程序更具可移植性

如何将“AppData\Roaming”重定向到子目录以使应用程序更具可移植性

便携式应用程序是优秀、简单的程序,不需要安装在您使用的每台计算机上。

有些软件安装程序似乎除了验证环境和将文件复制到硬盘之外,没有做太多事情。我希望将安装的 Windows 应用程序放在可以在计算机之间携带的外部硬盘(或 USB 设备)上。设置和数据也应存储在外部硬盘上,以便应用程序更改(或游戏进度)可以在计算机之间保存。

现在,许多 Windows 应用程序使用“AppData\Roaming”目录来存储某些设置和用户数据。此位置似乎存储在环境变量中。有没有办法可以暂时覆盖一个应用程序的USERPROFILE或位置?APPDATA这将是理想的,这样设置和数据就可以写入一个位置,而不是在外部硬盘和主机之间复制。

这超出了 PortableApps(tm) 的理念。我不想打包应用程序或安装一些荒谬的运行时。我所寻找的只是一些简单而好用的东西。

任何提出的解决方案都不得对其他应用程序造成任何干扰。

答案1

经过一些测试,我已经确认你可以覆盖Windows 环境变量在命令提示符中,它们的值将被随后从同一命令提示符启动的其他进程继承。因此,我们有以下批处理文件:

REM -- Path to the directory of this script (make sure to remove ending slash)
set CURRENT_DIR=%~dp0
REM -- Great example from Strawberry Perl's portable shell launcher:
if not "" == "%CURRENT_DIR%" if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1%

REM -- OVERRIDE the user environment variable to point to a portable directory
set USERPROFILE=%CURRENT_DIR%\Data

REM -- (Optional) Some programs do not use these environment variables
::set APPDATA=%CURRENT_DIR%\Data\AppData\Roaming>nul
::set ALLUSERSPROFILE=%CURRENT_DIR%\Data\AppData\Roaming>nul
::set PROGRAMDATA=%CURRENT_DIR%\Data\AppData\Roaming>nul

REM -- Start the application
start "" /D"%CURRENT_DIR%\MyAppDir" "myprogram.exe" "param 1" param_2 "param 3"

每个命令提示符在首次打开时都会收到自己的 Windows 环境变量副本,这些值可以独立于任何其他命令提示符进行更改。其他进程不受这些更改的影响。


另一方面,可以使用以下命令永久更改环境变量设置

相关内容