Что является некоторыми самыми полезными все же небольшими известными функциями на [закрытом] языке PowerShell

Попробуйте изменить update="insTable:display" на update="display". Я считаю, что вы не можете префикс id с идентификатором формы.

26
задан Andy Schneider 21 May 2009 в 14:45
поделиться

9 ответов

Команда $$ . Мне часто приходится выполнять повторяющиеся операции с одним и тем же путем к файлу. Например, проверьте файл и затем откройте его в VIM. Функция $$ делает это тривиальным

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

. Оно короткое и простое, но экономит много времени.

19
ответ дан 28 November 2019 в 06:07
поделиться

Выполните итерацию в обратном порядке по последовательности, просто используйте длину строки с 1 на другой стороне диапазона.

foreach (x в seq.length..1) {Do-Something seq [x]}

0
ответ дан 2 revs, 2 users 67% 15 October 2019 в 06:55
поделиться

Функция, которую я часто упускаю из виду, - это возможность передать файл в оператор switch.

Switch будет перебирать строки и сопоставлять их со строками (или регулярными выражениями с - параметр регулярного выражения), содержимое переменных, чисел или строки можно передать в выражение, которое будет оцениваться как $ true или $ 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'} 
}
15
ответ дан 28 November 2019 в 06:07
поделиться

$ OFS - разделитель выходных полей . Удобный способ указать, как элементы массива разделяются при отображении в строку:

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

Всегда гарантирует получение результата массива . Рассмотрим этот код:

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

$ files в этом случае могут быть $ null, скалярным значением или массивом значений. $ files.length не даст вам количество файлов, найденных для $ null или для одного файла. В случае одного файла вы получите размер файла !! Всякий раз, когда я не уверен, сколько данных я верну, я всегда заключаю команду в подвыражение массива, например:

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

Тогда $ files всегда будет массивом. Он может быть пустым или содержать только один элемент, но будет массивом. Это значительно упрощает рассуждение о результате.

Поддержка ковариации массива:

13
ответ дан 28 November 2019 в 06:07
поделиться

Along the lines of multi-variable assignments.

$list = 1,2,3,4

While($list) {
$head, $list = $list
$head
}

1
2
3
4

10
ответ дан 28 November 2019 в 06:07
поделиться

На сегодняшний день самой мощной функцией PowerShell является его поддержка ScriptBlock . Тот факт, что вы можете так кратко передать то, что фактически являются анонимными методами без каких-либо ограничений типа, примерно так же эффективен, как указатели функций C ++, и так же прост, как лямбды C # или F #.

Я имею в виду, как здорово, что с помощью ScriptBlocks вы можете реализовать оператор using (которого в PowerShell изначально нет). Или, до версии 2, вы даже могли реализовать 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(...)
}

Как это круто!

Тот факт, что вы можете так кратко передать то, что фактически являются анонимными методами без каких-либо ограничений типа, примерно так же эффективен, как указатели функций C ++, и так же прост, как лямбда-выражения C # или F #.

Я имею в виду, как здорово, что с помощью ScriptBlocks вы можете реализовать оператор using (которого в PowerShell изначально нет). Или, до версии 2, вы даже могли реализовать 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(...)
}

Как это круто!

Тот факт, что вы можете так кратко передать то, что фактически являются анонимными методами без каких-либо ограничений типа, примерно так же эффективен, как указатели функций C ++, и так же прост, как лямбда-выражения C # или F #.

Я имею в виду, как здорово, что с помощью ScriptBlocks вы можете реализовать оператор using (которого в PowerShell изначально нет). Или, до версии 2, вы даже могли реализовать 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(...)
}

Как это круто!

19
ответ дан 28 November 2019 в 06:07
поделиться

Я использовал это:

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

, и я также довольно часто использую $ _ (текущий объект конвейера), но они могут быть более известны, чем другие вещи.

8
ответ дан 28 November 2019 в 06:07
поделиться

Тот факт, что многие операторы также работают с массивами и возвращают элементы, для которых сравнение истинно, или работают с каждым элементом массива независимо:

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

Это быстрее, чем Где -Объект .

6
ответ дан 28 November 2019 в 06:07
поделиться

Не языковая функция, но очень полезная

f8 - принимает текст, который вы уже ввели, и выполняет поиск команды, которая начинается с этот текст.

3
ответ дан 28 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: