![不使用引号替换 powershell 中的字符](https://linux22.com/image/1616804/%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%BC%95%E5%8F%B7%E6%9B%BF%E6%8D%A2%20powershell%20%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6.png)
这种情况是由于 vifm(基于 vim 的文件浏览器)的限制而出现的,但问题实际上是关于 Windows 命令行和 powershell 的。
在 vifm 中我实现了以下命令:
:execute 'goto' fnameescape(term('powershell -Command " & {Get-ChildItem -Recurse | % { $_.FullName.Replace('\','/') }}" | fzf'))
它发送命令:
powershell -Command " & {Get-ChildItem -Recurse | % { $_.FullName.Replace('\','/') }}" | fzf
到 Windows 命令行(cmd.exe),它生成当前目录和子目录中所有文件和文件夹的完整路径列表,用正斜杠替换反斜杠(vifm 的goto
命令所要求)并将其通过管道传输到 fzf,然后可以在其中选择其中一行并将其发送到 vifm。
从 cmd.exe 运行此命令效果很好,运行
:execute 'goto' fnameescape(term('powershell -Command " & {Get-ChildItem -Recurse | % { $_.FullName }}" | fzf'))
通过 vifm。
我遇到的问题与 Replace 语句有关,因为它需要单引号或双引号,并且我已经使用单引号将整个 cmd.exe 参数封装在 vifm 中,并使用双引号将整个 powershell 命令封装在 cmd.exe 中。
有人可以建议一种方法来在一行中实现它,同时避免这个限制,以便它可以从 vifm 运行吗?
答案1
有人可以建议一种方法来在一行中实现它,同时避免这个限制,以便可以从中运行它吗
vifm
?
:execute
这里最好的策略可能是通过简单地将所需的 PowerShell 命令作为单独的脚本运行来消除语句中“额外”引号的需要.ps1
:
例如 fuzz_finder.ps1
& {Get-ChildItem -Recurse | % { $_.FullName.Replace('\','/') }} | fzf
然后您应该能够在中使用类似以下内容vifm
:
:execute 'goto' fnameescape(term('powershell fuzzy_finder.ps1'))
需要注意的一件重要事情是,该powershell fuzzy_finder.ps1
语法假定 ex.fuzzy_finder.ps1
脚本是“全局”可用的(即,它位于路径中的文件夹中)。
请注意,我可能会建议使用ForEach
代替%
例如:
& {Get-ChildItem -Recurse | ForEach { $_.FullName.Replace('\','/') }} | fzf
正如该问题的另一个答案中所建议的那样。虽然在这种情况下似乎没有太大的区别,但从ForEach
广泛缓解潜在的 PowerShell 执行问题的角度来看,它可能更“强大”。
答案2
尝试这个:
:execute 'goto' fnameescape(term('powershell -Command {Get-ChildItem -Recurse ^| ForEach { $_.FullName.Replace("\","/") }} | fzf'))