不使用引号替换 powershell 中的字符

不使用引号替换 powershell 中的字符

这种情况是由于 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'))

相关内容