2009-05-21 17 views
27

Hace un tiempo estaba leyendo sobre asignaciones de variables múltiples en PowerShell. Esto le permite hacer cosas como esta¿Cuáles son algunas de las características más útiles aunque poco conocidas en el lenguaje PowerShell

64 > $a,$b,$c,$d = "A four word string".split() 

65 > $a 
A 

66 > $b 
four 

O puede cambiar las variables en una sola instrucción

$a,$b = $b,$a 

Qué pepitas poco conocidos de PowerShell ¿Se ha encontrado que usted piensa que no puede ser tan conocido como ¿ellos deberían ser?

+0

Andy, ¿está restringiendo esto a PowerShell 1.0, o es 2.0 correcto para discutir? –

+0

Cualquier versión es genial –

+1

A medida que las personas publiquen ideas, sería útil decir en qué versión (1/2) están respaldadas. – Nate

Respuesta

19

El comando $$. A menudo tengo que hacer operaciones repetidas en la misma ruta de archivo. Por ejemplo, echa un vistazo a un archivo y luego ábrelo en VIM. La característica que hace que este trivial $$

PS> tf edit some\really\long\file\path.cpp 
PS> gvim $$ 

Es corto y simple, pero ahorra mucho tiempo.

+0

nunca se supo de eso ... pequeño bocado muy útil. ¡Gracias! –

+0

Realmente, -1?¿Alguien quiere explicar por qué pensaron que esta era una mala respuesta? – JaredPar

+0

Aquí hay muchas respuestas excelentes y agradezco a todos los que publicaron algo aquí. Elegí este por un par de razones. Personalmente no sabía sobre $$ y también fue la primera respuesta. Gracias de nuevo a todos los que intervinieron. ¡Mucha información excelente! –

13

$ OFS - output field separator. Una manera práctica para especificar cómo se separan los elementos de matriz cuando se representa en una cadena:

PS> $OFS = ', ' 
PS> "$(1..5)" 
1, 2, 3, 4, 5 
PS> $OFS = ';' 
PS> "$(1..5)" 
1;2;3;4;5 
PS> $OFS = $null # set back to default 
PS> "$(1..5)" 
1 2 3 4 5 

Always guaranteeing you get an array result. Tenga en cuenta este código:

PS> $files = dir *.iMayNotExist 
PS> $files.length 

$ archivos en este caso pueden ser $ null, un valor escalar o una matriz de valores. $ files.length no le proporcionará la cantidad de archivos encontrados para $ null o para un solo archivo. ¡En el caso de archivo único, obtendrá el tamaño del archivo! Siempre que no estoy seguro de la cantidad de datos voy a volver yo siempre incluyo el comando en una subexpresión gama de este modo:

PS> $files = @(dir *.iMayNotExist) 
PS> $files.length # always returns number of files in array 

luego $ archivos siempre será una matriz. Puede estar vacío o tener solo un elemento pero será ser una matriz. Esto hace que el razonamiento con el resultado sea mucho más simple. apoyo covarianza

Matriz:

PS> $arr = '127.0.0.1','192.168.1.100','192.168.1.101' 
PS> $ips = [system.net.ipaddress[]]$arr 
PS> $ips | ft IPAddressToString, AddressFamily -auto 

IPAddressToString AddressFamily 
----------------- ------------- 
127.0.0.1   InterNetwork 
192.168.1.100  InterNetwork 
192.168.1.101  InterNetwork 

Comparing arrays using Compare-Object:

PS> $preamble = [System.Text.Encoding]::UTF8.GetPreamble() 
PS> $preamble | foreach {"0x{0:X2}" -f $_} 
0xEF 
0xBB 
0xBF 
PS> $fileHeader = Get-Content Utf8File.txt -Enc byte -Total 3 
PS> $fileheader | foreach {"0x{0:X2}" -f $_} 
0xEF 
0xBB 
0xBF 
PS> @(Compare-Object $preamble $fileHeader -sync 0).Length -eq 0 
True 

Fore más cosas como esta, echa un vistazo a mi libro electrónico gratuito - Effective PowerShell.

10

En la línea de asignaciones de variables múltiples.

lista $ = 1,2,3,4

Mientras (lista $) {
$ cabeza, lista $ = lista $
$ cabeza
}

+0

Gracias por hacer de esto una respuesta wiki de la comunidad. – JasonMArcher

+0

¡qué ...! mind blown –

+0

Aquí hay una nueva versión mejorada: while ($ head, $ list = $ list) {$ head} - Es una buena técnica de cambio de matriz –

15

Una característica que encuentro a menudo se pasa por alto es el capacidad de pasar un archivo a una declaración de cambio.

interruptor se repetirá a través de las líneas y el partido contra las cuerdas (o expresiones regulares con el parámetro -regex), el contenido de variables, números o la línea se puede pasar en una expresión a ser evaluada como $ true o $ false

switch -file 'C:\test.txt' 
{ 
    'sometext' {Do-Something} 
    $pwd {Do-SomethingElse} 
    42 {Write-Host "That's the answer."} 
    {Test-Path $_} {Do-AThirdThing} 
    default {'Nothing else matched'} 
} 
+1

Creo que el libro de Bruce señaló que el cambio fue uno de los más poderosos construcciones de lenguaje en PowerShell. Pasar un archivo es muy bueno. Gracias Steve. –

+0

Eso lo hizo ... y creo que la parte del archivo es la más olvidada. Gracias por la pregunta! –

6

el hecho de que muchos operadores trabajan en matrices, así y devuelven los elementos en los que una comparación es verdadera o operan en cada elemento de la matriz de forma independiente:

1..1000 -lt 800 -gt 400 -like "?[5-9]0" -replace 0 -as "int[]" -as "char[]" -notmatch "\d" 

Esto es más rápido que Where-Object.

19

Con mucho, la característica más poderosa de PowerShell es su compatibilidad con ScriptBlock. El hecho de que pueda pasar de manera concisa lo que son métodos efectivamente anónimos sin ningún tipo de restricciones es tan poderoso como los punteros de función C++ y tan fácil como C# o F # lambdas.

Me refiero a qué tan bueno es que con ScriptBlocks puede implementar una instrucción "using" (que PowerShell no tiene de forma inherente). O bien, pre-v2 incluso podría implementar try-catch-finally.

function Using([Object]$Resource,[ScriptBlock]$Script) { 
    try { 
     &$Script 
    } 
    finally { 
     if ($Resource -is [IDisposable]) { $Resource.Dispose() } 
    } 
} 

Using ($File = [IO.File]::CreateText("$PWD\blah.txt")) { 
    $File.WriteLine(...) 
} 

How cool is that!

+0

bono en que yo no sabía sobre el -is operador –

8

He estado usando esto:

if (!$?) { # if previous command was not successful 
    Do some stuff 
} 

y también utilizo $ _ (objeto de canal actual) un poco, pero estos podrían ser más conocida que otras cosas.

3
No

una característica del lenguaje pero super útil

f8 - Toma el texto que ha puesto en ya y busca un comando que comienza con ese texto.

3

Tab-búsqueda a través de su historia con #

Ejemplo:

PS> Get-Process Explorer
PS> "Ford Explorer"
PS> "Magellan" | Add-Content "gran explorers.txt"
PS> escribir "gran explorers.txt"
PS> #expl < - Golpear la pestaña <clave> para desplazarse por las entradas del historial que tienen el término "expl"

1

Iterar hacia atrás sobre una secuencia sólo tiene que utilizar el len de la secuencia con un 1 en el otro lado de la gama ..

foreach (x en seq.length..1) {Do-Algo SEQ [x]}

Cuestiones relacionadas