PowerShell: расширение свойств объекта исключения в языковом файле. Powershell расширение


powershell - Использование PowerShell для добавления расширения к файлам

+1 до EBGreen, за исключением того, что (по крайней мере, на XP) параметр «-exclude» для get-childitem не работает. Текст справки (gci -?) На самом деле говорит: «Этот параметр не работает должным образом в этом командлете»!

Таким образом, вы можете фильтровать вручную следующим образом:

gci | ?{ !$_.PSIsContainer -and !$_.Name.EndsWith(".xyz") } | %{ ren -new ($_.Name + ".txt") }

Рассмотрим команду DOS FOR в стандартной оболочке.

C:\Documents and Settings\Kenny>help for Runs a specified command for each file in a set of files. FOR %variable IN (set) DO command [command-parameters] %variable Specifies a single letter replaceable parameter. (set) Specifies a set of one or more files. Wildcards may be used. command Specifies the command to carry out for each file. command-parameters Specifies parameters or switches for the specified command. ... In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string

code-examples.net

PSReadLine - расширение консоли PowerShell

Расширение возможностей консоли PowerShell с помощью PSReadLine

В Windows 10 у консоли PowerShell появилось много новых возможностей, некоторые из которых обеспечиваются модулем PSReadLine. PSReadLine — это сторонний PowerShell-модуль, предназначенный для расширения функционала консоли PowerShell. Использование этого модуля позволяет облегчить работу в консоли и сделать ее более комфортной.

Данные о модуле можно вывести командой:

Get-Module PSReadLine | fl

Функционал

PSReadLine обладает рядом полезных возможностей, таких как подсветка синтаксиса и предупреждение об ошибках при написании команд. Так в примере ниже пропущена кавычка и модуль сигнализирует об этом.

 

Также в модуле есть механизм автозавершения. Для примера вводим команду Get-Process и нажимаем  Ctrl+Space, затем перемещаясь с помощью стрелки выбираем нужный вариант из меню и жмем Enter. Очень удобно, особенно если не помнишь точные названия параметров.

 

При необходимости ввода многострочной команды можно воспользоваться сочетанием клавиш Shift+Enter, которое открывает новую строку для продолжения ввода команды. Что примечательно, здесь можно свободно перемещаться между строками и редактировать текст, находящийся на разных строках.

 

Отдельно стоит упомянуть об истории команд. Вообще в PowerShell есть своя история команд, однако PSReadLine ведет свою, по которой очень удобно осуществлять поиск. Поиск осуществляется с помощью сочетания клавиш Ctrl+R (поиск назад) и Ctrl+S (поиск вперед). Для поиска надо просто набрать нужное сочетание клавиш и в строке поиска ввести часть команды.

 

И что особенно примечательно, история команд сохраняется в текстовый файл и, соответственно, может быть использована в разных сессиях, а не только в текущей.

Настройка

Большинство функций в PSReadLine могут настраиваться. Для примера выведем список параметров, отвечающих за историю команд:

Get-PSReadlineOption | fl *history*

Теперь возьмем параметр HystoryNoDuplicates, отвечающий за исключение дублирующих команд из истории. По умолчанию он выключен. Включим его командой:

Set-PSReadlineOption -HistoryNoDuplicates

 

Сочетания клавиш также могут быть настроены под себя. Посмотреть текущие сочетания можно командой Get-PSReadlineKeyHandler,

 

а изменить — Set-PSReadlineKeyHandler. Для примера назначим на Ctrl+Q переход в начало , а на Ctrl+W — переход в конец истории команд:

Set-PSReadlineKeyHandler -Key ^Q -Function BeginningOfHistorySet-PSReadlineKeyHandler -Key ^W -Function EndOfHistory

Теперь нажимаем Ctrl+Q и получаем самую первую из введенных команд.

Установка

В Windows 10 модуль PSReadLine входит в состав системы, для других ОС его надо устанавливать отдельно. Сделать это можно несколькими разными способами. Наиболее удобный способ — это установка из репозитория PowerShell с помощью модуля PowerShellGet (ранее известного как OneGet). PowerShellGet входит в состав PowerShell v5 и Windows Management Framework 5, а для более ранних версий PowerShell (v3 и v4) может быть загружен и установлен отдельно.

PowerShellGet позволяет загрузить и установить модуль одной простой командой Install-Module PSReadLine. Кроме того, с помощью команды Update-Module можно обновлять модуль до новой версии.

Как вариант, PSReadLine можно установить из GitHub, с помощью стороннего модуля PsGet или вручную загрузив и распаковав его в папку с остальными модулями. Но, как заявляет автор модуля, это нерекомендуемый способ, поскольку в GitHub модуль обновляться не будет, а в перспективе может быть совсем оттуда удален.

windowsnotes.ru

[powershell-v2.0] powershell - извлечение имени файла и расширения [.net]

Если файл сходит с диска и, как утверждают другие, используйте свойства BaseName и Extension :

PS C:\> dir *.xlsx | select BaseName,Extension BaseName Extension -------- --------- .com Test Config .xlsx

Если вам дано имя файла как часть строки (скажем, из текстового файла), я бы использовал статические методы GetFileNameWithoutExtension и GetExtension из класса System.IO.Path :

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx") Test Config PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx") .xlsx

Если это из текстового файла, а предполагаемый файл имен окружен пробелами, это способ:

$a = get-content c:\myfile.txt $b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value $b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }

Если это файл, вы можете использовать что-то вроде этого на основе ваших потребностей:

$a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx $a Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 25/01/10 11.51 624 my.file.xlsx $a.BaseName my.file $a.Extension .xlsx PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type') PS C:\Users\joshua> $file.BaseName, $file.Extension file .type

Это адаптация, если кому-то интересно. Мне нужно было проверить, успешно ли RoboCopy скопировал один файл на несколько серверов для его целостности:

$Comp = get-content c:\myfile.txt ForEach ($PC in $Comp) { dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName }

Приятный и простой, и он показывает каталог и файл внутри него. Если вы хотите указать одно имя файла или расширение, просто замените * на все, что захотите.

Directory: \\SERVER\Folder\Share Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2/27/2015 5:33 PM 1458935 Test.pptx

code-examples.net

Шпаргалка: Windows PowerShell

Очень удобное средство в Windows для написания различных скриптов, автоматизирующих работу. Более мощное средство, чем стандартные cmd-скрипты. Файлы powershell-скриптов имеют расширение ".ps1". Вот пример простенького скрипта, в котором мы архивируем файлы с помощью 7-zip и копируем их в архивную папку:# archive files using 7-zip$application = "C:\Program Files\7-zip\7z.exe"$arguments = "a -tzip C:\xls.zip -r  F:\results\xls\*.*"$process = [Diagnostics.Process]::Start($application, $arguments)do { } while (!$process.HasExited)# create new folder and copy file $curdate = get-date -format "yyyyMMdd" $src = "C:\xls.zip"$dest = "D:\archives\$curdate"New-Item $dest -type directory -forceCopy-Item $src "$dest\xls.zip"Стоит особо пояснить строку do {  } while (!$process.HasExited). Здесь мы проверяем в цикле состояние запущенного процесса и скрипт не продолжит выполнятся, пока процесс создания файла архива полностью не завершится. Вместо этой конструкции можно использовать

$process.WaitForExit()

или вообще все в одну строчку лаконично уместить:[Diagnostics.Process]::Start($application, $arguments).WaitForExit() Инода возникает необходимость узнать дату, которая, предшествующую текущему времени и использовать ее, допустим, в названии архивной папки. Это можно сделать, например, таким образом:# get date before 30 days ago$date = (Get-Date).AddDays(-30)$datestr= "{0:yyyyMM}" -f $date $path = "D:\archives\$datestr"В результате переменная $path будет чем-то вроде  "D:\archives\200912". Удобно работать с файлами. Следующий скрипт, например, выводит список файлов и их размер:foreach ($file in Get-ChildItem "F:\old_bases\DBF"){   $file.name + " " +$file.length} В нижеприведенном примере происходит копирование файлов из одних папок в другие при помощи цикла foreach:foreach ($depNo in 40..75){   if(($depNo -gt 66) -and ($depNo -lt 72)) { continue }   $src = "F:\resultxls\dep" + $depNo + "\tables"   $dst = "T:\backup\dep" + $depNo+ "\tables"   Copy-Item "$src\*.xls" -destination "$dst"      "files to dep$depNo are copied"} Что интересно, запуск скриптов можно осуществлять как набрав в консоли паэршелла полный путь скрипта типа "D:\scripts\ps1scripts\test.ps1", так и "D:\scripts/ps1scripts/test.ps1". Причем при указании пути во втором случае при указании диска используется обратный слеш, а при указании пути прямой. Также можно в консоли пауэршелла применить команду cd и сделать нужную папку со скрипатми текущей, и вызвать из ее корня необходимый скрипт, набрав "./script.ps1". То есть точка и прямой слеш подразумевают текущую директорию.

Кстати говоря, сначала файлы скриптов не исполнялись, т.к. их запуск был запрещен политикой по умолчанию. Чтобы разрешить запуск скриптов, установим в powershell соответствующую политику безопасности:

Set-ExecutionPolicy Unrestricted Взято отсюда:- список команд с описанием- включение политик- простенький примерчик - особое спасибо автору этого поста про запуск консольных программ в пауэршелле- и этим людям за раскрытие темы контроля состояния запущенного процесса- форматирование строк

myworkonly.blogspot.com

powershell - PowerShell: расширение свойств объекта исключения в языковом файле

Я пишу сценарий, который содержит много строк, которые нужно выводить либо в журнал, либо на экран. Чтобы упростить обслуживание, я создал очень простой файл lang.xml, где храню строки. Многие строки отображают информацию, содержащуюся в переменных в скрипте, поэтому я написал небольшой командлет, который будет расширять строки в возвращаемых узлах xml #text.

Это работает очень хорошо, пока я не использую это в блоке catch для форматирования сообщений об ошибках. Когда я пытаюсь развернуть сообщение об исключении, например, возвращается пустая строка. Даже когда я передаю объект Exception в командлет, он расширяется до пустой строки. Ниже приведен фрагмент XML и командлет с примером вывода.

Пример XML:

<?xml version="1.0" ?> <lang> <keyword name="ERRMessage"> <string>"Error message: $($Exception.Exception.Message)"</string> </keyword> </lang> </xml>

Командлет:

function Read-Lang { [CmdletBinding()] param( [Parameter( Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, HelpMessage="The name atttribute of a keyword in lang.xml")] [string[]] $Keyword, $Exception ) begin { if ( $global:LangXML -eq $null ) { Write-Debug "Language XML has not been loaded, loading now." $global:LangXML = [xml] (Get-Content '.\lang.xml') } } process { foreach ( $name in $Keyword) { $Query = "/lang/keyword[@name='"$name'"]/string" $global:LangXML.SelectNodes($Query) | ForEach-Object { $ExecutionContext.InvokeCommand.ExpandString($_."#text") } } } }

Пример:

try { get-content goo -ErrorAction Stop} catch { Read-Lang -KeyWord 'ERRMessage' -Exception $_ }

Ожидаемый результат:

Error Message: Cannot find path 'path\to\goo' because it does not exist.

Фактический выход:

Error Message: источник поделиться

qaru.site

powershell - Папка установки PowerShell и script расширение имени файла по версиям

Это древнее сообщение в блоге (2007), но оно по-прежнему применяется; Короче говоря:

  • Пока новые версии PowerShell остаются обратно совместимыми, они заменяют более ранние версии:

    • Место установки, отображаемое в $PSHOME - $env:systemroot\System32\WindowsPowerShell\v1.0, останется прежним.

    • Расширение имени файла - .ps1 - останется прежним.

  • Сценарии, созданные для более ранней версии, будут продолжать работать.

  • Чтобы пометить script как требуемую версию <n> как минимум, используйте #requires -version <n> в верхней части script (технически она может быть размещена в любом месте script, но имеет смысл разместить его сверху).

На момент написания этой статьи (PowerShell v5.1) с v1 поддерживалась обратная совместимость, поэтому расположение установки и расширение имени файла остались прежними.

Чтобы получить текущий сеанс версии PowerShell:

> [string] $PSVersionTable.PSVersion 5.1.14393.693 # PSv5.1 example

В общем случае hashtable $PSVersionTable, введенная в v2, содержит несколько частей информации о версии (не полностью), описанную в Get-Help about_Automatic_Variables:

Name Value ---- ----- PSVersion 5.1.14393.693 # The PowerShell version. PSEdition Desktop # 'Desktop'=*Windows* PS; 'Core'=PS *Core* PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} # array of compatible versions BuildVersion 10.0.14393.693 # OS version? only if it came natively CLRVersion 4.0.30319.42000 # The .NET CLR version WSManStackVersion 3.0 # WS-Management (WinRM) version PSRemotingProtocolVersion 2.3 # remoting-protocol version SerializationVersion 1.1.0.1 # serialization-protocol version

qaru.site

Powershell сортировка файлов по расширению часть 2

Powershell сортировка файлов по расширению часть 2

Переписал скрипт который сортирует файлы по расширению, в случае уже имеющегося файла, дописывается текущая дата в имя файла. Все также создает папки по типу  расширения и перемещает туда файлы.

cd C:\users\win13\Downloads\ $dirext = (dir -path C:\users\win13\Downloads\).Extension $dirext -replace "^." -replace "\s" |%{mkdir -Name $_ -ErrorAction SilentlyContinue} dir -path C:\users\win13\Downloads\ -File|%{ $exten = $_.Extension -replace "^." ; $cname = $_.name ; $datestamp = (get-date -Format d) $fullpath = "C:\users\win13\Downloads\" +  "$exten" + "\" + "$cname" ;  $pathdir = "C:\users\win13\Downloads\" +  "$exten" if(Get-ChildItem  $cname -Path $pathdir) { $newname = "$datestamp" + "_" + "$cname"  $fullpathnewname = "C:\users\win13\Downloads\" + "$exten"+ "$newname" Rename-Item $cname $newname  } else{ Move-Item -Destination $fullpath -Path $_.PSPath } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

cd C:\users\win13\Downloads\

$dirext = (dir -path C:\users\win13\Downloads\).Extension

$dirext -replace "^." -replace "\s" |%{mkdir -Name $_ -ErrorAction SilentlyContinue}

dir -path C:\users\win13\Downloads\ -File|%{

$exten = $_.Extension -replace "^." ;

$cname = $_.name ;

$datestamp = (get-date -Format d)

$fullpath = "C:\users\win13\Downloads\" +  "$exten" + "\" + "$cname" ; 

$pathdir = "C:\users\win13\Downloads\" +  "$exten"

if(Get-ChildItem  $cname -Path $pathdir)

{

$newname = "$datestamp" + "_" + "$cname" 

$fullpathnewname = "C:\users\win13\Downloads\" + "$exten"+ "$newname"

Rename-Item $cname $newname 

}

else{

Move-Item -Destination $fullpath -Path $_.PSPath

}

}

 

Posted in PowerShell on 16 апреля 2018 and tagged extension, file, PowerShell, sort No Comments »

win13.ru