使用特殊字符重新启动自身不起作用,没有特殊字符则可以

问题描述 投票:0回答:1

尝试让脚本重新启动自身,以便使其立即隐藏,因为我为用户提供了带有 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
batch-file cmd
1个回答
0
投票

答案就在问题中,我只是没看到。 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
© www.soinside.com 2019 - 2024. All rights reserved.