Заметки о Windows и других программных продуктах Microsoft...

Варианты использования символа $ в PowerShell

Варианты использования символа $ в PowerShell

Символ $ (доллар) достаточно часто применяется в PowerShell. В сегодняшней заметке мы рассмотрим некоторые известные и не очень варианты его использования.

$ (доллар) — применяется для обозначения переменных, например:

$a = ″Hello, world″

$$ (двойной доллар) — возвращает окончание последней выполненной команды, а $^ (доллар и крышка) — начало последней выполненной команды. В качестве примера выполним команду:

Write-Host $a

Теперь если набрать $^, то получим первую часть предыдущей команды (Write-Host), а команда $$ выдаст вторую ее часть ($a).

использование $ для обозначения переменной

 

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

′one′, ′two′, ′three′ | foreach {Write-Host $_}

переменная $_

 

А такой командой мы отсортируем и выведем на экран запущенные на компьютере процессы с Id меньше 100:

Get-Process | where {$_.Id -le 100}

использование $ в конвейере

 

$? (доллар и знак вопроса) — встроенная переменная, хранящая статус выполнения предыдущей команды. Возвращает True если команда была выполнена успешно и False — если с ошибкой.

вывод состояния выполнения последней команды

 

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

$a = 3
$b = 2
″The sum is $($a + $b)″

пример подвыражения

 

И еще пример:

$process = Get-Process
″There are $($process.Length) process running in my PC″

использование $ в качестве подвыражения

 

${} (доллар и фигурные скобки) — позволяет использовать в имени переменной нестандартные символы. Например:

${@,&#$>?=*} = ″Hello, world″

Еще одна особенность этой конструкции в том, что если в имени присутствует двоеточие (:), то оно интерпретируется как путь. Например, если в качестве имени переменной указать путь к файлу файл, то значение будет записано прямо в этот файл:

${C:\Files\file.txt} = ″Hello, world″

использование $ при обозначении нестандартного имени переменной

 

Ну, пожалуй все, больше вариантов использования $ я не нашел. Пишите, если знаете еще какие нибудь нестандартные варианты.

 
 
Комментарии
Роман

Спасибо!

Символ $ используется для определения переменной. Так же powershell создает автоматические переменные. Получить о них информацию можно через Get-Help about_Automatic_Variables или в technet https://technet.microsoft.com/en-us/library/hh847768.aspx

Такие дела. 😉 Согласен что про Default Variable $_ или $PSItem нужно рассказывать в первую очередь, так как он дает ключевые возможности при работе с пайпами или внутри foreach-object, where-object

Это, что ж , в повершелл, можно и математикой заниматься ?

Вот вы тут всё так красиво и понятно пишите, отлично знаете powershell и другое, не могли бы вы подсказать в одной непростой ситуации с вязаной с powershell. И вопрос, то в общем не сложный, но облазив просторы интернета, ответа на него так и не нашел. Собственно в чем дело: очень много в примерах показывают использования команды copy-item только для локального , копирования, переброса данных из одной директории в другую и это действительно просто и работает, как пример Copy-Item C:\folder\test.txt C:\folder2\folder3 .и таких примерах завались, чего скрывать, даже у меня получилось ), более сложный пример с расшаренной папкой на сетевом ресурсе что-то типа: Copy-Item — patch C:\Scripts\test.txt -distanation \\server\folder написал пример на глаз, но найти подобное можно, хоть и с большим трудом, а как быть если я хочу через powershell скопировать всю папку с содержимым или отдельный файл на удаленный компьютер в закрытою директорию, допустим через SMB это бы выглядело просто \\server\D$ или \\server\d$\folder (рабочая группа, между прочем, не домен) , далее был бы запрос логина и пароля и вуаля всё копируется, а через PS кто нибудь может подсказать каким чудом это сделать ?

Если вопрос в логине и пароле, то можно так:
$credentials = Get-Credentials computer\user
Copy-Item -Credentials $credentials

Нет вопрос не в логине и пароле, до этого даже не доходит, вот пример того что нужно: Copy-item -Path C:\Logs\Text.txt -Destination \\server\d$ (тут всё просто, нужно скопировать Text.txt ., который находится на локальном компьютере, на server в корневую директорию диска D ) вставив в powershell данную команду получаю ошибку: не удается найти путь «C:\Logs\Text.txt» так, как он не существует, самое интересное, что путь такой существует и по SMB всё делается легко. Кстати можете сами смоделировать подобную ситуацию, для этого нужно два компьютера в сети.

О, уже лучше, получил ошибку «отказано в доступе», возможно и в домене всё это и прокатит, а с рабочей группой PowerShell не очень дружит в этом плане.

PowerShell дружит и с доменом и с рабочей группой, ему без разницы 🙂
Для проверки доступа есть командлет Test-Path.