PowerShell批处理文件切换显示触摸输入面板

y3bcpkx1  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(147)

我需要一个批处理文件,当我运行将显示触摸输入面板(虚拟键盘)时隐藏,否则,如果已经可见,然后隐藏它。触摸输入面板的路径是:
C:\Program Files\Common Files\Microsoft shared\ink\tabtip.exe
以下是我迄今为止尝试的方法:

FOR /f "tokens=*" %%a IN ('TASKLIST ^| FINDSTR /i TabTip.exe') DO 
( IF "%ErrorLevel%"=="0" 
    ( TASKKILL /IM TabTip )
ELSE 
    ( start "C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe" ) 
) 
PAUSE

字符串

xe55xuns

xe55xuns1#

这应该是可行的:

# Settings
$ProcessName = "TabTip"
$Executable = "C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe"

# Get process
$Process = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue

# Is it running?
If($Process)
{
    # Running

    # Kill this process
    $Process.Kill()
}
Else
{
    # Not running

    # Start the process
    Start-Process $Executable
}

字符串
我试过用

Stop-Process $Process


以及与

Stop-Process $Process.Id


但我总是得到一个访问拒绝(不知道为什么)。
但是,Kill()方法工作正常,您应该使用

yxyvkwin

yxyvkwin2#

PowerShell可能是现在更好的选择(参见现有的答案),但它可以通过一行代码轻松地批处理(甚至不需要for循环):

TASKLIST | FINDSTR /i "TabTip.exe" && TASKKILL /f /IM TabTip.exe || "C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe"

字符串
为了获得更好的可读性和可扩展性:

TASKLIST | FINDSTR /i "TabTip.exe" && (
    TASKKILL /f /IM TabTip.exe 2>nul
    echo killed.
) || (
    "C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe"
    echo started.
)


为什么你的代码不工作:

  • 错误的for语法:开始的(必须与do在同一行上
  • %errorlevel%在这里是没有意义的,因为for循环中的命令是在一个新的独立进程中执行的,所以你不会在原始进程(你的脚本)中得到一个错误级别(也就是说,它和循环之前一样)。
  • 对于taskkill,您需要/f(强制)开关,因为TabTip是少数几个在关闭请求时不能正确退出的程序之一。
  • 您的start语法错误:start将第一个带引号的字符串作为窗口标题(可以为空),因此它应该是start "" "blahblah\app.exe"
  • 您不需要start命令,因为您正在启动GUI应用程序。

相关问题