You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell SendKeys特殊字符兼容问题及VBS转PowerShell方法咨询

解决PowerShell SendKeys特殊字符异常及VBS脚本转换问题

嘿,作为PowerShell新手碰到这个问题太正常了!我来帮你把这两个问题都搞定:

一、为什么特殊字符会触发异常?

SendKeys方法里的~%!@#^&*()这些字符有特殊功能:比如~代表回车键,%代表Alt键,^代表Ctrl键,直接发送会被解析成快捷键而非普通字符,所以会出现异常。

解决核心就是把特殊字符用{}包裹,让SendKeys将其识别为普通文本。

二、将VBS的特殊字符处理逻辑转换成PowerShell

我们可以把VBS里的遍历判断逻辑改成PowerShell函数,这样就能直接整合到你的脚本里:

方法1:逐字符遍历处理(和VBS逻辑完全对应)

先写一个处理字符串的函数:

function Convert-ToSendKeysString {
    param(
        [Parameter(Mandatory=$true)]
        [string]$InputString
    )
    $specialChars = @('{', '}', '(', ')', '[', ']', '^', '%', '+', '~')
    $result = ''
    foreach ($char in $InputString.ToCharArray()) {
        if ($specialChars -contains $char) {
            $result += "{$char}"
        }
        else {
            $result += $char
        }
    }
    return $result
}

然后整合到你的原脚本中:

# 初始化Shell对象
$wshell = New-Object -ComObject wscript.shell
# 激活记事本窗口
$wshell.AppActivate('notepad')
# 等待窗口激活(睡眠时间可根据实际调整)
Start-Sleep -Seconds 1
# 要发送的文本(包含特殊字符)
$textToSend = "Hello! ~%!@#^&*()[]{}+ World"
# 转换为SendKeys兼容格式
$processedText = Convert-ToSendKeysString -InputString $textToSend
# 发送按键
$wshell.SendKeys($processedText)

方法2:正则表达式替换(更简洁高效)

如果觉得逐字符遍历麻烦,也可以用正则一次性替换所有特殊字符:

function Convert-ToSendKeysString {
    param(
        [Parameter(Mandatory=$true)]
        [string]$InputString
    )
    # 匹配所有需要转义的特殊字符,用{}包裹
    return $InputString -replace '([{}()\[\]^%+~])', '{$1}'
}

这个函数和上面的功能完全一致,但代码更简洁,适合处理长文本。

三、验证效果

运行上面的脚本后,记事本里会正确输出:Hello! ~%!@#^&*()[]{}+ World,而不会触发快捷键或者乱码。

内容的提问来源于stack exchange,提问作者shadad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:48:28