Replicando la sustitución de comandos de Bash en PowerShell -- powershell camp codereview Relacionados El problema

Replicating Bash's command substitution in PowerShell


4
vote

problema

Español

Quiero poder usar la búsqueda de Bash ^ ^ Reemplazar la funcionalidad en PowerShell, el más cercano que puedo venir es con esta función y vincularlo con el alias ^.

Así que en Bash haría:

  $ ping google.com $ ^google^bing   

y luego llegaría a ping bing sin volver a escribir el comando.

en Ps con este código tengo que hacer:

  > ping google.com > ^ google^bing   

El espacio adicional no es tan grande para mí. Sin embargo, hay otros problemas que no estoy seguro de cómo arreglar.

  1. Si hago algunas de las solicitudes y reemplaza en una fila, el término se encuentra en un comando anterior, por lo que no activa el error al que le impide ejecutar un comando aleatorio. Es decir:
 PS H:  & GT; ^ gdsajhfgajhgjf ^ dominio.com     GDSAJHFGAJHGJF no se encuentra en el comando anterior ...  PS H:  & GT; ^ gdsajhfgajhgjf ^ dominio.com     GDSAJHFGAJHGJF no se encuentra en el comando anterior ...  PS H:  & GT; ^ gdsajhfgajhgjf ^ dominio.com     Ping Domain.com 
  1. Los comandos que se ejecutan no se ingresan en la historia de PowerShell. Entonces, mientras corren, como lo esperaba, no puedo volver y ver los comandos. Miré a través de la documentación para obtener- historia , add- Historia y invocaciones-historia pero no puedo encontrar Una forma de usar aquellos para cualquier cosa.

  2. No estoy seguro de si hay mejores formas de hacer esto, en general. Miré a su alrededor, pero no puedo encontrar nada que se vea comparable a esta funcionalidad. Parece inelegante a mí debido a la forma en que funciona la historia de PowerShell, no inserta el comando que realmente se ejecuta, simplemente inserta ^ Search ^ Reemplazar para que tenga que volver hasta que encuentre el último comando real, y luego haz la búsqueda / reemplaza en eso.

de todos modos, aquí está el código:

 función PSREPlace {     param ([cadena] $ searchandreplace)      $ Searchterm = $ sechankandreplace.split ("^") [0]     $ Buscar = $ Searchterm     $ Reemplazar = $ searchandreplace.split ("^") [- 1]     $ Commandhistory = Get-History      $ Encontrado = $ falso     $ Commandcount = -1     $ MASTCOMMAND = $ CommandHistory [$ CommandCount] .commandline      Si ($ MASTCOMMAND [0] -ne "^") {         Si ($ MASTCOMMAND-PLAY "* $ SEANTORTM *") {             $ Encontrado = $ verdadero         }     }      demás{         while ($ MASTCOMMAND [0] -EQ "^") {             $ Commandcount - = 1             $ MASTCOMMAND = $ CommandHistory [$ CommandCount] .commandline             $ Search = $ MASTCOMMAND.SPLIT ("") [1] .split ("^") [0]              Si ($ MASTCOMMAND-PLAY "* $ SEANTORTM *") {                 $ Encontrado = $ verdadero             }         }     }      Si ($ encontrado -EQ $ FALSO) {         Tirar "$ Searchterm que no se encuentra en el comando anterior"     }      $ ReemplazadoCommand = $ LaTCOMMAND.REPLACE ($ Buscar, $ Reemplazar)     Write-host $ reemplazandoCommand     Invoke-Expression $ reemplazadaCommand } 
Original en ingles

I want to be able to use Bash's ^search^replace functionality in PowerShell, the closest I can come is with this function and linking it to the alias ^.

So in Bash I would do:

$ ping google.com $ ^google^bing 

And then I'd get to ping bing without re-writing the command.

In PS with this code I have to do:

> ping google.com > ^ google^bing 

The extra space isn't that big of a deal to me. However, there are some other issues that I'm not sure of how to fix.

  1. If I do a few of the search and replaces in a row, the term is found in a previous command, so it doesn't trigger the error which prevents it from running a random command. IE:
 PS H:\> ^ gdsajhfgajhgjf^domain.com     gdsajhfgajhgjf not found in previous command ...  PS H:\> ^ gdsajhfgajhgjf^domain.com     gdsajhfgajhgjf not found in previous command ...  PS H:\> ^ gdsajhfgajhgjf^domain.com     ping domain.com 
  1. The commands that are run aren't ever entered into the PowerShell history. So while they run as one would hope, I can't go back and see the commands. I looked through the documentation for get-history, add-history and invoke-history but can't find a way to use those for anything.

  2. I'm not sure if there's better ways to do this, in general. I looked around but can't find anything that looks comparable to this functionality. It seems inelegant to me because of the way PowerShell's history works doesn't insert the command that's actually run, it just inserts ^ search^replace so I have to go back until it finds the last actual command, and then do the search/replace on that.

Anyhow, here's the code:

Function PSReplace {     param ([string]$SearchAndReplace)      $SearchTerm = $SearchAndReplace.split("^")[0]     $Search = $SearchTerm     $Replace = $SearchAndReplace.split("^")[-1]     $CommandHistory = Get-History      $Found = $False     $CommandCount = -1     $LastCommand = $CommandHistory[$CommandCount].CommandLine      if ($LastCommand[0] -ne "^"){         if ($LastCommand -like "*$SearchTerm*"){             $Found = $True         }     }      else{         while ($LastCommand[0] -eq "^"){             $CommandCount -= 1             $LastCommand = $CommandHistory[$CommandCount].CommandLine             $Search = $LastCommand.Split(" ")[1].split("^")[0]              if ($LastCommand -like "*$SearchTerm*"){                 $Found = $True             }         }     }      if ($Found -eq $False){         Throw "$SearchTerm not found in previous command"     }      $ReplacedCommand = $LastCommand.Replace($Search, $Replace)     write-host $ReplacedCommand     Invoke-Expression $ReplacedCommand }
  

Lista de respuestas


Relacionados problema

3  Eliminar seda huérfana + cambio a control completo  ( Delete orphaned sids change to full control ) 
Necesito eliminar todos los SID huérfanos en las ACL de aproximadamente 20 acciones (entre 100 GB / 6TB) y cambiar el control total de los grupos de usuarios ...

2  Agregando algunas propiedades a un usuario de Active Directory  ( Adding some properties to an active directory user ) 
Estaba escribiendo la siguiente sección del código que agrega algunas propiedades de usuario a un usuario de Active Directory, y se preguntó, seguramente pode...

10  Comparación de hash MD5 para dos carpetas  ( Md5 hash comparison for two folders ) 
usando esta página para un punto de partida para comparar el hash md5 Valores de los archivos en dos carpetas diferentes, he colocado algo juntos que las em...

6  Sherlock va en contra de la bestia con PowerShell  ( Sherlock is going against the beast with powershell ) 
I corrí a este desafío un par de veces hoy y pensé que podría abordarlo con Potencia Shell. Me negué a mirar a otros enfoques de los pueblos a esto con la e...

9  Script PowerShell para manipular archivos de Excel  ( Powershell script for manipulating excel files ) 
Tengo un directorio de libros de trabajo .xls con la siguiente convención de nomenclatura: public class Hand { // in general it is one idea more corr...

9  Convierta una contraseña a una cadena fonética para usuarios finales  ( Convert a password to a phonetic string for end users ) 
Tanto como lo odio, a veces proporcionar contraseñas a las personas debe hacerse electrónicamente. Cuando hago eso, trato de eliminar cualquier ambigüedad que...

2  Resume un directorio con PowerShell  ( Summarize a directory with powershell ) 
Estoy tratando de generar información agregada sobre un árbol de directorios (extensión de archivo más conteo y tamaño acumulativo por tipo de archivo) con Po...

6  Extraiga la cadena de la versión del archivo de texto con PowerShell  ( Extract version string from text file with powershell ) 
Necesito tirar de la versión # de un script de VIM que podría parecer algo así: #!/bin/bash LAST=`exec ls example_dir | sed 's/([0-9]+).*/1/g' | sort -n |...

8  Actualizando múltiples repositorios SVN usando PowerShell  ( Updating multiple svn repositories using powershell ) 
Escribí un script para realizar ReportWithSections2 en todos los repositorios SVN dentro de una carpeta. Hubiera sido genial si la carpeta que contiene todo...

1  Exportando bolsas, listas de saltos y archivos LNK con PowerShell  ( Exporting shellbags jump lists and lnk files with powershell ) 
Soy nuevo en PowerShell (comenzó ayer) y se preguntó si hay una forma de exportar bolsas de cáscara, listas de saltos y archivos LNK de la Región de Región de...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos