防止 PowerShell Select-String 将冒号解析为驱动器号

Prevent PowerShell Select-String from parsing colon as a drive letter

我有一个每次打开 PowerShell 时都会执行的配置文件 window。由于我进行了一些 SSH,因此我需要确保在启动 PowerShell 后立即添加我的。但是我想避免询问我的 SSH 密码,只要它已经添加到 ssh-agent。这个问题的解决方法是here,但是对于Linux shell.

我已将那里描述的解决方案转换为等效的 PowerShell,如下所示:

$ssh_add = "$env:ProgramFiles/Git/usr/bin/ssh-add.exe"
$ssh_keygen = "$env:ProgramFiles/Git/usr/bin/ssh-keygen.exe"
$my_key_path = "$env:USERPROFILE/.ssh/id_rsa"

$my_ssh_key = & $ssh_keygen -lf $my_key_path
$ssh_keys = & $ssh_add -l

if (!(Select-String -Pattern $my_ssh_key -Path $ssh_keys -SimpleMatch -Quiet))
{
    & $ssh_add -t 5h $my_key_path
}

SSH 密钥恰好包含冒号,PowerShell 似乎将其视为驱动器号。这会导致以下错误消息:

Select-String : Cannot find drive. A drive with the name '4096 SHA256' does not exist.

以下形式的 SSH 密钥:

$my_ssh_key = 4096 SHA256:somelongSSHkey some.email@whosebug.com (RSA)
$ssh_keys = 4096 SHA256:anotherlongSSHkey /c/Users/MyUser/.ssh/id_rsa (RSA)

如何防止冒号被解析为驱动器号分隔符?

-Path 应该是一条路径。您为其提供的价值自然会被解释为一条路径。您可以转义冒号,但这并不能解决您告诉 Select-String 将某物视为路径而不是路径的问题。

您现在正在使用 -Path 的地方需要 -InputObject(可以缩短,因为所有 PS 参数都可以)参数。这将匹配文字字符串,而不是将其视为要搜索的文件。您也可以将 $ssh_keys 的内容通过管道传输到 Select-String,而不指定任何路径。

if (!(Select-String -Input $ssh_keys -Pattern $my_ssh_key -SimpleMatch -Quiet))
...

有关完整文档,请参阅 https://technet.microsoft.com/library/hh849903.aspx