尝试让脚本重新启动自身,以便使其立即隐藏,因为我为用户提供了带有 powershell oneliner 的基于表单的 gui,但是如果文件名本身中有特殊字符,我将无法重新启动。路径中可以有特殊字符一直到文件名,但如果它们在文件名本身中则不会。
有人知道解决这个问题的方法吗?
名称中使用 & 的 cmd 文件足以使其失败。
*编辑:我认为 %cmdcmdline% 环境变量可能会弄乱传递的引号
REM Request Admin if not, Generates UAC prompt
CALL :ELEVATE
IF /I NOT "%~dp0" == "%ProgramData%\" (
COPY /Y "%~f0" "%ProgramData%"
CALL START /MIN "Test Window" "%ProgramData%\%~nx0">nul
EXIT /b
)
ECHO MADE IT!
PAUSE
EXIT /b
:ELEVATE
>nul 2>&1 REG ADD HKCU\Software\classes\.thisFile\shell\runas\command /f /ve /d "CMD /x /d /r SET \"f0=%%2\"& CALL \"%%2\" %%3"
>nul 2>&1 FLTMC|| IF NOT "%f0%"=="%~f0" (cd.>"%ProgramData%\elevate.thisFile"&START "%~n0" /min /high "%ProgramData%\elevate.thisFile" "%~f0"&EXIT)
>nul 2>&1 REG DELETE HKCU\Software\classes\.thisFile\ /F &>nul 2>&1 del %ProgramData%\elevate.thisFile /F /Q
EXIT /b
答案就在问题中,我只是没看到。 elevate 函数/sub 使用注册表项在重新启动期间以保留特殊字符的方式传递文件名。同样的技巧也可以用在我所坚持的部分。
示例:
REM Request Admin if not, Generates UAC prompt
CD.>"%ProgramData%\elevate.thisFile"
CALL :ELEVATE
IF /I NOT "%~dp0" == "%ProgramData%\" (
COPY /Y "%~f0" "%ProgramData%"
START "USE THE GUI TO SELECT A FILE" /min "%ProgramData%\elevate.thisFile" "%ProgramData%\%~nx0"
>nul 2>&1 REG DELETE HKCU\Software\classes\.thisFile\ /F &>nul 2>&1 del %ProgramData%\elevate.thisFile /F /Q
EXIT /b
)
ECHO MADE IT!
PAUSE
EXIT /b
:ELEVATE
>nul 2>&1 REG ADD HKCU\Software\classes\.thisFile\shell\runas\command /f /ve /d "CMD /x /d /r SET \"f0=%%2\"& CALL \"%%2\" %%3"
>nul 2>&1 FLTMC|| IF NOT "%f0%"=="%~f0" (START "%~n0" /min /high "%ProgramData%\elevate.thisFile" "%~f0"&EXIT)
EXIT /b