防止 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。
我有一个每次打开 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。