Executando o script do PowerShell por meio do menu de contexto do Explorer em itens que contêm E comercial em seus nomes

Executando o script do PowerShell por meio do menu de contexto do Explorer em itens que contêm E comercial em seus nomes

Estou usando uma versão ligeiramente modificada da técnica fornecida emesta respostapara criar um item de menu de contexto no explorador de arquivos do Windows que me permita executar um script do PowerShell em pastas específicas.

O comando se parece com:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

Isso funciona bem, exceto quando a pasta tem um E comercial (&) em seu nome. Então recebo o seguinte erro (a pasta de destino foi nomeada Testing & Testing):

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

Claramente, algo está interpretando o e comercial como um caractere especial, mas não sei como consertar isso. Eliminar o e comercial do nome da pasta não é uma solução viável para mim.

Uma solução que não envolva um script em lote seria preferida.

Estou usando o Windows 7 Enterprise (64 bits) com PowerShell 2.

Responder1

Você pode usar omarcador literaldo Powershell : --%, ele informa ao Powershell que qualquer coisa que o siga não deve ser interpretada.

Dessa forma, seu comando se tornaria:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

A menos que haja aspas duplas nos nomes dos arquivos, tudo bem.

Este marcador é novo no Powershell 3.0, portanto, certifique-se de mantê-lo atualizado.

Responder2

Você pode tentar modificar seu script do PowerShell. E mude a linha cmd para arquivo em lote ...

Seu lote (runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

A segunda linha significa definir a pasta onde o arquivo runner.cmd está como a pasta atual para que você possa executar o script do PowerShell sem o caminho completo. Torna mais fácil mover as coisas, pois você não precisa editar o arquivo runner.cmd.

E acesse seu caminho através do seguinte em seu script:

$value = $env:ps_arg -replace """",""

As aspas do arquivo em lote parecem ter sido passadas para o script do PowerShell e precisam ser removidas, daí o arquivo -replace """","". Como aspas duplas são ilegais em nomes de arquivos do Windows, isso nunca removerá nada importante.

Então, a linha de comando será

cmd /K runner.cmd "%1"

Responder3

É uma questão de cotação. Substitua as aspas duplas de escape por aspas simples de escape para que seu comando fique assim:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

Você está usando dois programas diferentes (cmd e powershell) e executando três partes de código diferentes que podem receber argumentos (cmd, powershell e o script .ps1).

cmd precisa de três argumentos: /K Powershell e os argumentos para powershell. Os argumentos para o PowerShell devem ser uma string, por isso estão entre aspas.

O Powershell precisa de um argumento: a linha de comando que você deseja executar.

O script .ps1 precisa do argumento: a pasta a ser executada. O Powershell precisa interpretar o caminho como uma única string, portanto, precisa estar entre aspas.

Quando você executa o comando, o cmd inicia o Powershell e envia a string entre aspas com a variável expandida e sem aspas ou caracteres de escape:C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

As aspas garantem que o script veja um argumento em vez de três.

(Não sei por que os diferentes tipos de cotações produziram resultados diferentes (até onde eu sei), mas produziram quando testei, então forneci a solução que funcionou no meu sistema. Se você puder fornecer mais detalhes, talvez eu consiga encontrar uma solução que funcione para você também.)

informação relacionada