我使用密码管理器来管理我的所有密码。首选的 .exe 是从加密的 USB 驱动器运行的。我的笔记本电脑上的 VeraCrypt 容器中有一个备份,另一个备份托管在服务器上。
我更喜欢只使用便携版本,除非我碰巧丢失了它或无法访问它。我不想手动打开目录并运行我想要使用的 .exe 文件,而是想自动执行该过程:
File pManager = PasswordManager.exe
File U = USB.pManager
File L = Laptop.pManager
File S = Server.pManager
if (USB.isConnected && U.isPresent): Run --> U
if (!USB.isConnected && L.isPresent): Run => L
else (Server.Connect)
if (S.isPresent): Run=> S
else:
Message("Find your USB Key!")
我曾尝试在 bash/cmd/PowerShell 中逐行执行逻辑 - 这可行,但比简单地打开目录要麻烦得多。然后我开始编写一个 shell 脚本来自动化该过程,但很快意识到我必须以纯文本形式存储我的一些凭据,而我想避免这种情况。我不需要帮助编写代码;搜索后,我找不到自动化此过程的最佳程序。
哪种执行方法(shell 脚本、C/Java 程序)是自动化此过程的最简化方法,而不会向可能访问该文件的人暴露凭据?
答案1
以下批处理文件解决了我的问题,之后不会留下任何挂起的 CMD 窗口,并检查以确保该进程未运行并且驱动器已安装。
相同的逻辑可以用于存在于多个位置的任何文件。只有在进程已运行时,CMD 窗口才会保持打开状态。
如果您不想收到已在运行的进程的通知,请删除该:ProcessFound
部分并将条件语句指向goto END
:
:: Batch file to open Password Manager. Prefer .exe located on USB drive
:: If USB not mounted, open local (D:) version.
@echo off
SETLOCAL EnableExtensions
set EXE=PWManager.exe
set USB="F:\Password\PWManager.exe"
set HDD="D:\Software\Password\PWManager.exe"
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound
goto ProcessNotFound
:ProcessFound
echo %EXE% is already running. Ensure it is running from the correct location...
pause
goto END
:ProcessNotFound
if exist f:\ (
goto USBMounted
)
goto USBNotMounted
:USBMounted
start "" %USB%
goto END
:USBNotMounted
start "" %HDD%
goto END
:END
exit