【问题标题】:Batch file stuck depending on .... ¿¿¿¿folder?批处理文件卡住取决于....¿¿¿¿文件夹?
【发布时间】:2021-10-14 08:16:56
【问题描述】:

我正在编写一个批处理文件来创建电源计划。最终目的是将其包含在设置中。但是当我运行安装程序时,批处理文件会卡住(安装程序 bat 文件没有暂停)。经过大量更改和阅读,我决定从头开始,我发现相同的批处理文件取决于文件夹(没有相对路径)。这些都是事实

我正在运行 Windows 10 专业版

文件 1:C:\Users\idoblas\Desktop\powerCFG\original\POWERCFG_ES.BAT 文件 2:C:\Users\idoblas\Desktop\powerCFG\POWERCFG_ES.BAT

这些是我的测试:

  • 文件 2 是文件 1 的副本。两者具有相同的编码、文件大小......我 已经比较然后使用超越比较和winmerge
  • 如果我双击文件 1,它可以正常工作(它会返回一个错误 要求管理员权限),如果我以管理员身份运行它 效果也很好
  • 如果我双击文件 2,它会在暂停前卡在@第 6 行,但以管理员身份执行时可以正常工作,这是执行的最后一行:
FOR /F "tokens=6" %%G IN ('powercfg /getactivescheme') DO set activeschemeGUID=%%G
  • 我已经更改了文件 2 的权限,让每个人都可以完全控制文件而无需更改
  • 在其他文件夹中尝试过并像文件 1 一样工作,问题是在我的设置中,行为就像在文件 2 中一样
  • 如果我从 cmd shell 运行 cmd.exe /k C:\Users\idoblas\Desktop\powerCFG\powercfg_es.bat 它可以工作,但如果我从 cmd 窗口执行批处理文件,它也会卡住

这里是代码:

REM @echo off
SETLOCAL

REM Get GUID of current power scheme
REM tokens = 6 for spanish OS, tokens = 4 fo english OS
FOR /F "tokens=6" %%G IN ('powercfg /getactivescheme') DO set activeschemeGUID=%%G
PAUSE

REM Custom power scheme name
set custom_name=Evolv_power_plan
PAUSE

REM Check if it already exists and if it exists, get its GUID

FOR /F "tokens=6" %%G IN ('powercfg -list ^| find "%custom_name%"') DO (
    REM custom power scheme with that name already exists
    set custom_GUID=%%G
    goto :SetCustomActive
)
PAUSE

REM Here we're sure it doesn't exist: copy current active scheme and get GUID of that copy
FOR /F "tokens=6" %%G IN ('powercfg -DUPLICATESCHEME %activeschemeGUID%') DO set custom_GUID=%%G
PAUSE

REM change the name of the new scheme (the copy) to the custom name
powercfg -CHANGENAME %custom_GUID% %custom_name%
PAUSE

:SetCustomActive
powercfg -SETACTIVE %custom_GUID%
set activeschemeGUID=%custom_GUID%
PAUSE

REM Power settings allways ON
POWERCFG /CHANGE monitor-timeout-ac 0
POWERCFG /CHANGE monitor-timeout-dc 0

PAUSE

POWERCFG /CHANGE disk-timeout-ac 0
POWERCFG /CHANGE disk-timeout-dc 0

PAUSE

POWERCFG /CHANGE standby-timeout-ac 0
POWERCFG /CHANGE standby-timeout-dc 0

PAUSE

POWERCFG /CHANGE hibernate-timeout-ac 0
POWERCFG /CHANGE hibernate-timeout-dc 0

PAUSE

REM vISUALIZAR FAST STARTUP - HIBERNAR
powercfg /hibernate on

PAUSE

REM boton de power, QUE APAGUE
powercfg -setacvalueindex %activeschemeGUID% SUB_BUTTONS UIBUTTON_ACTION 2
powercfg -setdcvalueindex %activeschemeGUID% SUB_BUTTONS UIBUTTON_ACTION 2
powercfg -setacvalueindex %activeschemeGUID% SUB_BUTTONS PBUTTONACTION 000 
powercfg -setdcvalueindex %activeschemeGUID% SUB_BUTTONS PBUTTONACTION 000 

PAUSE

rem mantener usb
powercfg -setacvalueindex %activeschemeGUID% 2a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0
powercfg -setdcvalueindex %activeschemeGUID% 2a737441-1930-4402-8d77-b2bebba308a3 48e6b7a6-50f5-4782-a5d4-53bb8f07e226 0

PAUSE
ENDLOCAL
PAUSE

提前感谢您的宝贵时间

【问题讨论】:

  • 对于批处理文件 2,它是批处理文件目录中的唯一文件吗?该文件夹中不可能有另一个名为powercfg 的文件?
  • 您不能创建与系统可执行文件同名的批处理文件。将 powercfg.bat 重命名为 powerconfig.bat 或类似的不作为可执行文件存在的东西。 cmd 将在当前工作目录中查找文件,然后再查看环境路径。在这种情况下,它会找到powercfg.bat 本地并且不会执行位于C:\Windows\System32 中的powercfg.exe,但建议不要在脚本中使用完整路径。即FOR /F "tokens=6" %%G IN ('C:\Windows\System32\powercfg.exe /getactivescheme') DO set activeschemeGUID=%%G
  • 感谢您的回答! @Squashman 这就是问题所在!非常感谢!!!
  • @Gerhard 谢谢,我会更改文件名

标签: batch-file


【解决方案1】:

此解决方案由@Squashman 提供

问题是在同一个文件夹中我有另一个批处理文件名为 powercfg.bat,所以这个循环

FOR /F "tokens=6" %%G IN ('powercfg -list ^| find "%custom_name%"') DO (
REM custom power scheme with that name already exists
set custom_GUID=%%G
goto :SetCustomActive

没有运行系统的 powercfg.exe 。当以管理员身份执行时,它是从管理员的默认文件夹中执行的,因此没有 powercfg.bat 并且它已正确执行

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多