Execução do script do PowerShell através do menu de contexto do explorador em itens que contêm e comercial em seus nomes

2

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

O comando parece:

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

É evidente que 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 preferível.

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

    
por Kris 28.11.2013 / 14:43

3 respostas

2

Você pode usar o marcador textual do Powershell: --% , ele diz 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 nos seus nomes de arquivos, tudo bem.

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

    
por 05.12.2013 / 17:08
1

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

Seu lote (runner.cmd)

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

A segunda linha significa definir a pasta na qual o arquivo runner.cmd está na pasta atual, para que você possa executar o script do PowerShell sem o caminho completo. Facilita a movimentação de coisas, pois você não precisa editar o arquivo runner.cmd.

E acesse seu caminho usando o seguinte no seu script:

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

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

Então, a linha de comando será

cmd /K runner.cmd "%1"
    
por 28.11.2013 / 18:35
0

É um problema de citação. Substitua as aspas duplas com escape por aspas simples com escape para que seu comando tenha esta aparência:

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

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

cmd precisa de três argumentos: / K Powershell e os argumentos para o powershell. Os argumentos para o powershell devem ser uma string, é por isso que eles 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, por isso precisa estar entre aspas.

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

As citações garantem que o script veja um argumento em vez de três.

(Eu não tenho certeza porque os diferentes tipos de citações produziram resultados diferentes (eles não devem ter tanto quanto eu sei), mas eles fizeram quando eu testei, então eu forneci a solução que funcionava no meu sistema. pode fornecer mais detalhes, eu posso ser capaz de chegar a uma solução que funcione para você também.)

    
por 02.12.2013 / 20:50

Tags