Path test powershell: Test-Path: We Goofed | PowerShell
Test-Path в Powershell проверка существования файла и папки
Powershell Test-Path проверяет весь путь на наличие папки или файла. Если хотя бы один элемент пути не существует, то команда вернет False при этом нельзя исключать корректность синтаксиса.
В этом варианте команда вернет True:
Test-Path -Path 'C:\Program Files\'
А в этом ошибку т.к. мы не экранировали путь в кавычки:
Test-Path -Path C:\Program Files\
Test-Path : A positional parameter cannot be found that accepts argument ‘Files\’.
Test-Path : Не удается найти позиционный параметр, принимающий аргумент «Files\».
У нас есть ключ PathType проверяющий существование отдельного элемента пути. Написав:
- Container — проверяет существование папки будь то обычный каталог или реестр.
- Leaf — файл или любой другой элемент, который не содержит в себе другие элементы.
- Any — либо контейнер, либо лист (leaf).
Т.е. такая команда вернет False, т.к. конечный элемент это файл, а не директория:
Test-Path -PathType Container -Path 'C:\Program File1s\desktop.ini'
По умолчанию команда проверяет путь и файл.
Фильтрация в Powershell Test-Path
Мы можем предполагать, что в папке находиться файл с неизвестным именем и хотим проверить это. В самом ключе Path возможно использовать простые маски. Выполнив следующую команду у нас вернется True, если в папке находится хотя бы один файл заканчивающийся на .txt:
#file exists
Test-Path -PathType Leaf -Path "C:\*.txt"
Аналогично, если мы проверяем путь, причем промежуточный:
Test-Path -Path 'C:\Wind*\System32\'
Доступен ключ IsValid и он должен валидировать путь на корректное написание. Если мы его установим, то вместо того что бы проверять существование пути будет проверяться корректность написания:
Test-Path -IsValid -Path "C:\Windows\System32\@AppHelpToast.png"
Достаточно странный ключ и похоже он проверяет только эти символы в пути: » * : < > ? | , хотя при создании запрещен еще и другой слэш.
Есть еще два интересных ключа:
- Include — включает проверку объекта
- Exclude — исключает проверку объекта
С помощью этих ключей мы можем проверить, например, существует ли в папке документы *.txt и *.docx одновременно или узнать есть ли что-то кроме *.jpg. Для работы с этими параметрами нужно указать * в конце пути как на примере:
Test-Path -Include "*.log" -Path "C:\Windows\*"
Похожие маски мы можем делать и для ключа Filter, но он принимает только одно значение:
Test-Path -Path "C:\Windows\*" -Filter "*.log"
Проверка в Powershell наличия сетевой папки и файла
Можно проверять сетевой путь через эту команду, но многие отписываются о багах (у меня их не было):
Test-Path -Path "\\192.168.3.100\Folder2\*" -Include "*.txt"
#check share folder
Test-Path "X:\*" -Include "*.txt"
Папку, как видно, я подключал через команду New-SmbMapping описанной раннее.
Если испытаете сложности с проверкой сетевых папок, и файлов попробуйте вариант с классом .Net, но он не может использовать маски:
[System.IO.Directory]::Exists("C:\")
Второй вариант, где AD1 имя сервера, а Folder2 папка:
Test-Path $('filesystem::\\AD1\Folder2\')
…
Теги:
#powershell
Test-Path
Проверяет, существуют ли все элементы пути.
Синтаксис
Test-Path [-LiteralPath] <string[]> [-Credential <PSCredential>] [-Exclude <string[]>] [-Filter <string>] [-Include <string[]>] [-IsValid] [-PathType {<Any> | <Container> | <Leaf>}] [-UseTransaction] [<CommonParameters>] Test-Path [-Path] <string[]> [-Credential <PSCredential>] [-Exclude <string[]>] [-Filter <string>] [-Include <string[]>] [-IsValid] [-PathType {<Any> | <Container> | <Leaf>}] [-UseTransaction] [<CommonParameters>]
Описание
Командлет Test-Path проверяет, существуют ли все элементы пути. Он возвращает значение TRUE ($true), если все элементы существуют, и значение FALSE ($false) в противном случае. Также он может определить, допустим ли синтаксис пути и на какой элемент указывает путь — контейнер или конечный элемент («лист» дерева каталогов).
Параметры
-Credential <PSCredential>
Задает учетную запись пользователя, который располагает разрешением для выполнения этого действия. По умолчанию используется значение «Текущий пользователь».
Введите имя пользователя, например «User01» или «Domain01\User01». Или укажите объект PSCredential, например один из объектов, созданных командлетом Get-Credential. При вводе имени пользователя система запросит пароль.
Этот параметр не поддерживается ни одним из установленных с Windows PowerShell поставщиком.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
true (ByPropertyName)
|
Принимать подстановочные знаки?
|
false
|
-Exclude <string[]>
Исключает указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
-Filter <string>
Задает фильтр с использованием формата или языка поставщика. Значение этого параметра определяет значение параметра Path. Синтаксис фильтра, в том числе использование подстановочных знаков, зависит от поставщика. Фильтры эффективнее других параметров, потому что поставщик применяет их при извлечении объектов (вместо использования Windows PowerShell для фильтрации извлеченных объектов).
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
-Include <string[]>
Проверяет только указанные пути. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
-IsValid
Определяет, допустим ли синтаксис пути, независимо от того, существуют ли элементы пути. Этот параметр возвращает значение TRUE, если синтаксис пути допустим, и значение FALSE в противном случае.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
-LiteralPath <string[]>
Задает путь, который нужно проверить. В отличие от параметра Path, значение параметра LiteralPath используется в том виде, в котором оно введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает escape-символы, его нужно заключить в одиночные кавычки. Одиночные кавычки указывают оболочке Windows PowerShell, что никакие символы не следует интерпретировать как escape-символы.
Обязательно?
|
true
|
Позиция?
|
1
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
true (ByPropertyName)
|
Принимать подстановочные знаки?
|
false
|
-Path <string[]>
Задает путь, который нужно проверить. Подстановочные знаки разрешены. Путь, содержащий пробелы, необходимо заключать в кавычки. Имя параметра («Path») указывать необязательно.
Обязательно?
|
true
|
Позиция?
|
1
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
true (ByValue, ByPropertyName)
|
Принимать подстановочные знаки?
|
false
|
-PathType <TestPathType>
Сообщает, имеет ли последний элемент пути определенный тип. Этот параметр возвращает значение TRUE, если элемент имеет указанный тип, и значение FALSE в противном случае.
Допустимые значения:
— Container: элемент, содержащий другие элементы, такие как каталог или раздел реестра.
— Leaf: элемент, не содержащий других элементов, например файл.
— Any: либо контейнер, либо конечный элемент. Сообщает, имеет ли последний элемент пути определенный тип. Возвращает TRUE, если элемент имеет указанный тип, и FALSE в противном случае.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
-UseTransaction
Включает команду в активную транзакцию. Этот параметр допустим, только если транзакция выполняется. Дополнительные сведения см. в разделе about_Transactions.
Обязательно?
|
false
|
Позиция?
|
named
|
Значение по умолчанию
| |
Принимать входные данные из конвейера?
|
false
|
Принимать подстановочные знаки?
|
false
|
<CommonParameters>
Данный командлет поддерживает общие параметры -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer и -OutVariable. Дополнительные сведения см. в разделе
about_Commonparameters.
Ввод и вывод
Входным типом является тип объектов, которые можно передавать командлету по конвейеру. Возвращаемым типом является тип объектов, возвращаемых командлетом.
Входные данные
| System.String Строку, содержащую путь (но не литеральный путь), можно передать командлету Test-Path по конвейеру. |
Выходные данные
| System.Boolean Командлет возвращает значение «True», если путь существует, и «False» в противном случае. |
Примечания
Командлеты, в именах которых содержится существительное Path (командлеты Path), оперируют именами путей и возвращают эти имена в сокращенном формате, который поддерживается всеми поставщиками Windows PowerShell. Они предназначены для использования в программах и скриптах, в которых требуется отображать имя пути или его часть в конкретном формате. Используйте их аналогично другим командам для работы с путями, таким как Dirname, Normpath, Realpath и Join.
Командлеты Path можно использовать с несколькими поставщиками, включая FileSystem, Registry и Certificate.
Командлет Test-Path предназначен для работы с данными, предоставляемыми любым поставщиком. Чтобы получить список поставщиков, доступных в текущем сеансе, введите команду «Get-PSProvider». Дополнительные сведения см. в разделе About_Providers.
Пример 1
C:\PS>test-path -path "C:\Documents and Settings\NicoleH" Описание ----------- Эта команда сообщает, существуют ли все элементы пути, т. е. каталог C:, каталог Documents and Settings и каталог NicoleH. Если какой-либо из элементов отсутствует, командлет возвращает FALSE. В противном случае он возвращает TRUE.
Пример 2
C:\PS>test-path -path $profile C:\PS>test-path -path $profile -IsValid Описание ----------- Приведенные команды проверяют путь к профилю Windows PowerShell. Первая команда проверяет, существуют ли все элементы пути. Вторая команда проверяет правильность синтаксиса заданного пути. В данном случае путь задан неверно (FALSE), однако его синтаксис верен (TRUE). В приведенных командах используется автоматическая переменная $profile, указывающая местоположение профиля (даже в том случае, когда его не существует). Дополнительные сведения об автоматических переменных см. в разделе about_Automatic_Variables.
Пример 3
C:\PS>test-path -path "C:\CAD\Commercial Buildings\*" -exclude *.dwg Описание ----------- Эта команда сообщает, имеются ли в каталоге Commercial Buildings какие-либо файлы, отличные от DWG-файлов. Для задания пути используется параметр Path. Поскольку путь содержит пробел, он заключен в кавычки. Звездочка в конце пути указывает обозначает содержимое каталога Commercial Buildings. (В случае длинного пути, такого как этот, введите первые несколько букв пути, а затем заполните путь с помощью клавиши TAB.) Параметр Exclude используется для задания файлов, исключаемых из проверки. В данном случае, поскольку каталог содержит только DWG-файлы, результат выполнения команды — FALSE.
Пример 4
C:\PS>test-path -path $profile -pathtype leaf Описание ----------- Эта команда сообщает, указывает ли хранящийся в переменной $profile путь на файл. В данном случае, поскольку профиль Windows PowerShell представляет собой файл с расширением .ps1, командлет возвращает TRUE.
Пример 5
C:\PS>test-path -path HKLM:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell TRUE C:\PS> test-path -path HKLM:\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell\ExecutionPolicy FALSE Описание ----------- На примере этих команд показано применение командлета Test-Path к поставщику Registry Windows PowerShell. Первая команда проверяет правильность пути к разделу реестра Microsoft.PowerShell на компьютере. Если оболочка Windows PowerShell установлена правильно, командлет возвратит TRUE. Командлет Test-Path корректно работает не со всеми поставщиками Windows PowerShell. Например, Test-Path можно использовать для проверки пути к разделу реестра, однако при использовании его для проверки пути к записи реестра он всегда будет возвращать FALSE, даже если запись присутствует.
См. также
Настройка переменной пути Windows PowerShell
МОЕ ПРЕДЛОЖЕНИЕ ЭТО ОДНО
я протестировал это, чтобы добавить C:\oracle\x64\bin к пути постоянно, и это работает нормально.
$ENV:PATH
первый способ просто сделать:
$ENV:PATH=”$ENV:PATH;c:\path\to\folder”
но это изменение не является постоянным, $env: path по умолчанию вернется к тому, что было раньше, как только вы закроете терминал powershell и снова откроете его. Это потому, что вы применили изменение на уровне сеанса, а не на уровне источника (который является уровнем реестра). Для просмотра глобальное значение $env: path, do:
Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH
или, более конкретно:
(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
теперь, чтобы изменить это, сначала мы фиксируем исходный путь, который необходимо изменить:
$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path
теперь мы определяем, как должен выглядеть новый путь, в этом случае мы добавляем новую папку:
$newpath = “$oldpath;c:\path\to\folder”
Примечание: убедитесь, что $newpath выглядит так, как вы хотите, чтобы он выглядел, если нет, то вы можете повредить свою ОС.
теперь применить новые значение:
Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath
теперь сделайте последнюю проверку, что это выглядит так, как вы ожидаете:
Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Contro
l\Session Manager\Environment’ -Name PATH).Path
теперь вы можете перезапустить терминал powershell (или даже перезагрузить компьютер) и увидеть, что он не откатывается к старому значению снова. Обратите внимание, что порядок путей может измениться так, что он находится в алфавитном порядке, поэтому убедитесь, что вы проверяете всю строку, чтобы упростить ее, вы можете разделить вывод на строки, используя двоеточие в качестве делиметра:
($env:path).split(“;”)
Windows PowerShell — полезные заметки
Windows PowerShell — это оболочка командной строки и скриптовый язык с большими возможностями и красивым синтаксисом, предназначенный для системного администрирования. Windows PowerShell отличное средство для управления и автоматизации администрирования ОС Windows, а также приложений, работающих под управлением Windows.
Я был ярым поклонником vbs-скриптов. Так как заметил, что для тех задач, для которых ранее использовал Delphi, вполне годится скриптовый язык сценариев vbs. Ведь это намного удобней просто открыть блокнот, накидать туда несколько строк, сохранить файл с нужным расширением и запустить скрипт. Для этого не нужно ничего устанавливать, как например Delphi, который к тому же платный.
Хоть vbs неплох, но его преемник PowerShell имеет куда более широкий функционал.
У меня есть vbs-скрипт, который автоматически публикует изображения на одном из блогов. Возникла необходимость выравнивать изображение по ширине или высоте, в зависимости от разрешения добавляемого изображения. И вот я не смог получить разрешение изображений с помощью vbs-скрипта, а вот через PowerShell это делается очень просто.
Если начиная с ОС Windows 7 PowerShell идет в комплекте с самой Windows, то в Windows XP его нужно скачать и установить — скачать PowerShell V2 для Windows XP SP3.
5-ю версию Powershell можно скачать по ссылке: microsoft.com, там же расписано какой файл для нужной ОС качать и как установить.
Как разрешить запуск локальных PowerShell скриптов?
По умолчанию Windows не даст запустить PowerShell-скрипты из-за соображений безопасности. Необходимо разрешить выполнение локальных скриптов. Выполните команду в консоли (она разрешит запускать локальные скрипты и скачанные скрипты подписанные доверенным сертификатом):
powershell -Command Set-ExecutionPolicy RemoteSigned
Иначе при попытке запустить свой скрипт вы увидите вот такой текст:
Не удается загрузить файл C:\ImageSize.ps1, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений.
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException
Чтобы вернуть эту политику безопасности обратно, напишите:
powershell -Command Set-ExecutionPolicy Restricted
Чтобы разрешить запускать любые скрипты, без проверки подписи, напишите:
powershell -Command Set-ExecutionPolicy Unrestricted
Если при запуске скрипта вы наблюдаете такое сообщение:
Security Warning Run only scripts that you trust. While scripts from the Internet can be useful, this script can potentially harm your computer. Do you want to run \server\scripts\my.ps1? [D] Do not run [R] Run once [S] Suspend [?] Help (default is «D»): d
И хотите от него избавиться, то при запуске скрипта используйте параметр -ExecutionPolicy Bypass
Пример:
powershell -ExecutionPolicy Bypass -file "\\server\scripts\my.ps1"
Как запустить PowerShell скрипт?
Введите в командной строке команду
Powershell -File your-script-name.ps1
Где your-script-name.ps1 — имя вашего скрипта. Файлы PowerShell-скриптов имеют расширение *.ps1
Справка или помощь по Windows PowerShell
В PowerShell есть различные командлеты для получения той или иной справки. Но наиболее важный из них это: Get-Help
Введите в консоли команды:
powershell -command Get-Help
powershell -command Get-Help -?
И получите два различных описания, которые дополняют друг-друга, того как пользоваться справкой.
Возможности справки достаточно обширны, с примерами и детальным описанием на русском языке. Потому можно выводить ее в различных форматах.
Например:
- powershell -command Get-Help Get-Help — общая справка по командлету Get-Help
- powershell -command get-help Get-Help -examples — примеры того, как можно использовать командлет get-help
- powershell -command get-help Get-Help -detailed — подробная справка по командлету get-help
- powershell -command get-help Get-Help -full — наиболее полная справка по командлету get-help
winintro.ru/windowspowershellhelp.ru/ — справка в виде html-книги
Заметки о Windows Powershell:
Операторы сравнения
- -eq — Equal — Равно
- -ne — Not equal — Не Равно
- -ge — Greater than or equal — Больше или Равно
- -gt — Greater than — Больше
- -lt — Less than — Меньше
- -le — Less than or equal — Меньше или Равно
- -like — Wildcard comparison — Использование символов подстановки для поиска соответствия образцу
- -notlike — Wildcard comparison — Использование символов подстановки для поиска несоответствия образцу
- -match — Regular expression comparison — Использование регулярных выражений для поиска соответствия образцу
- -notmatch — Regular expression comparison — Использование регулярных выражений для поиска несоответствия образцу
- -replace — Replace operator — Заменяет часть или все значение слева от оператора
- -contains — Containment operator — Определение, содержит ли значение слева от оператора значение справа. Результатом является булево значение
- -notcontains — Containment operator — Определение того, что значение слева от оператора не содержит значение справа. Результатом является булево значение
По умолчанию операторы сравнения не являются чувствительными к регистру.
Для сравнения с учетом регистра к команде подставляется префикс «c». Для примера, оператор -eq с зависимостью от регистра изменяется на «-ceq».
Для явно заданного независящего от регистра сравнения к команде подставляется префикс «i». Пример: оператор -replace без зависимости от регистра будет -ireplace
Типы:
- -is — Является типом
- -isnot — Не является типом
- -as — Как тип, без ошибки если возникает неудача преобразования
Логические операторы PowerShell:
- -and — Оба условия должны быть истины, чтобы выражение было истинно
- -or — Одно или оба условия должны быть истины, чтобы выражение было истинно
- -xor — Одно условие должно быть истинно, а второе должно иметь значение «ложь», чтобы выражение было истинно
- -not — Указанные условия должны иметь значение «ложь», чтобы выражение было истинно
- ! — Указанное условие должно иметь значение «ложь», чтобы выражение было истинно
Примеры:
$myVar -is "String" $myVar -eq 123 $myVar -ceq $myVar2 "abcdef" -like "abc*" "abcdef" -replace "dEf","xyz" $myVar1 -is "String" -and $myVar2 -is "Int" (1 -eq 1) -and -not (2 -gt 2)
Операции со строками
#Разбить строку по пробелам: $string = "Test string" $string.split(" ") $string.IndexOf(" ") #Ищем в $string первый пробел # Возвращает отсчитываемый от нуля индекс первого вхождения PS> "abcdeabcde".indexOf("cde") 2 # Возвращает позицию индекса с отсчетом от последнего вхождения указанного символа PS> "abcdeabcde".lastIndexOf("c") 7 # Возвращает подстроку начиная с 1 позиции PS> "abcdefgh".Substring(1) bcdefgh # Возвращает подстроку начиная с 1 позиции и длиной в 4 символа PS> "abcdefgh".Substring(1,4) bcde # Вставка подстроки с позиции 0 PS> "abcdefgh".insert(0,"X") Xabcdeabcde # Удаление с позиции 0 длиной 2 PS> "abcdefgh".remove(0,2) cdeabcde # Свойство объекта - длина строки PS> "abcdefgh".length 8 # Возвращает True, если строка содержит подстроку "cde" PS> "abcdefgh" .Contains("cde") True # Возвращает True, если строка начинается с подстроки "abc" PS> "abcdefgh".startsWith("abc") True # Возвращает True, если строка заканчивается подстрокой "fgh" PS> "abcdefgh".endsWith("fgh") True # Возвращает True, если строка содержит подстроку "cde" PS> $"abcdefgh" -like "*cde*" True # Возвращает массив , где "d" - разделитель PS> "abcdefgh" -split "d" abc efgh # Возвращает строку , объединенную из двух ":" - разделитель PS> "abcdefgh", "xyz"-join ";" abcdefgh;xyz # Возвращает строку где "abc" будут заменены на "XYZ" PS> "abcdefgh".replace("abc","XYZ") XYZdefgh # Возвращает строку где символы приводятся к ВЕРХНЕМУ регистру PS> "abcdefgh".ToUpper() ABCDEFGH # Возвращает строку где символы приводятся к нижнему регистру PS> "ABCDEFGH".ToLower() abcdefgh
Предопределенные переменные
$home – каталог пользователя
$NULL – пусто
$true – истина
$false – лож
$DebugPreference – “Continue” выводить отладку, “SilentlyContinue” не выводить отладочную информацию. См. команду Write-Debug
Работа с файлами
$string | Out-File $file -Append #Дописать $string новой строкой в файл $file $string = get-content -Path $file #Получить в $string содержимое файла $file $jokes = [io.file]::ReadAllText($file) #читаем весь файл в одну строку Test-Path "C:\test.txt" #Проверить существование файла
Найти все файлы с определенным расширением расширением в каталоге и подкаталогах.
Затем скопировать эти файлы в другой каталог.
$flist = get-childitem e:\doc\* -include *.pdf -recurse $flist | ForEach-Object{$_.CopyTo("e:\doc\all_pdf\" + $_.PSChildName)}
ls d:\ | ?{$_.psiscontainer} | select fullname #Показать только каталоги ls d:\ | ?{!$_.psiscontainer} | select fullname #Показать только файлы $local = Get-Location #Текущий каталог $local.Path # Рабочий каталог $local.Drive.Root # Корень $local.Drive.Name # Буква диска $local.Drive.Used # Использовано диска $local.Drive.Free # Свободно на диске
Вывод полных имен файлов на диске D: которые изменялись в промежутке времени от 1 июня 2014-го года до 20 сентября 2014-го года :
ls d:\ -recurse | ?{!$_.psiscontainer} | select fullname,LastWriteTime | Where-Object { $_.LastWriteTime -ge "06/01/2014" -and $_.LastWriteTime -le "09/20/2014"}
Вывод текста на экран
# текст на который надо обратить внимание. Выделяется желтым. Write-Warning("Текст требующий внимания") # Просто выводит текст Write-Host("Просто текст") #включили вывод отладочной информации $DebugPreference = "Continue" # вывели отладочную информацию Write-Debug "Cannot open file." # отключили отладочную вывод отладочной информации $DebugPreference = "SilentlyContinue"
Сделать паузу на несколько секунд
Start-Sleep -s 15 # Пауза на 15 секунд
Пауза в консоли, до нажатия Enter
Read-Host "Нажмите Enter"
Работа с процессами
#Задача: убить все процессы с именем Notepad # Способ №1 get-process Notepad | Stop-Process # Способ №2 (Работает только с одним процессом) $plist = get-process Notepad $plist.Kill() # Способ №3 (то же что и 2, но все процессы) $plist = get-process Notepad $plist | ForEach-Object {$_.Kill()} #Получить процессы и даты их запуска: Get-Process| Format-Table Name,StartTime -AutoSize
Инкремент
$i++ — в момент вызова i имеет старое значение, но после увеличивается на 1++
++$i — в момент вызова i увеличивается на 1
Массивы
$array = 17,15,160 #создали масив из трех элементов $array -contains $element #содержит ли массив элемент $file1[0] #0-й элемент массива $file1.count #размер масива #удаление элемента "asdf" из массива $array = @("adsf","adf","erge") $array = $array |? {$_ -ne "adf"} #получаем только уникальные элементы массива $a = @(1,2,3,4,5,5,6,7,8,9,0,0) $a = $a | select -uniq #индекс первого вхождения элемента в массив $array.indexOf("cde")
Конструкция If Elseif Else
if ( $i -eq 0 ) { Write-Host("i равно нулю") } ElseIf ( $i -eq 1 ) { Write-Host("i равно одинице") } Else { Write-Host("i не равно нулю или одинице") }
Цикл ForEach
$services = Get-Service ForEach ($service in $services) { $service.Stop() }
[char]65 #конвертация ASCII-кода в символ [int][char]'A' #конвертация символа в ASCII-код [int[]][char[]]'Hello' #конвертация строки в ASCII-коды
Ждем нажатия любой клавишы:
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL $HOST.UI.RawUI.Flushinputbuffer() $host.ui.RawUI.WindowTitle = "elimS Window Title" #задаем заголовок окна
Типы данных в PowerShell
Наиболее распространенные типы:
[string] Fixed-length string of Unicode characters [char] A Unicode 16-bit character [byte] An 8-bit unsigned character [int] 32-bit signed integer [long] 64-bit signed integer [bool] Boolean True/False value [decimal] A 128-bit decimal value [single] Single-precision 32-bit floating point number [double] Double-precision 64-bit floating point number [DateTime] Date and Time [xml] Xml object [array] An array of values [hashtable] Hashtable object
Еще есть такие встроенные константы: $true, $false, $null
Unicode: To encode a Unicode character in a PowerShell string, prefix the unicode with 0x and cast it to System.Char:
PS > [char]0x263a ☺
Преобразование типов данных
To force a conversion to a specific datatype, prefix the value or variable with the type in square brackets, this is known as a Cast Operator and forces the chosen datatype:
PS C:\> [int]"0064" 64 PS C:\> [int]$false 0 PS C:\> [byte]('0x' + 'FF') 255
Testing DataTypes
PS C:\> 32 -is [int]
True PS C:\> $true -is [bool]
True
Функции в Powershell
function elimS { #функция имеющая несколько входных параметров param([string]$string = "значение по умолчанию", [int]$integer = 7) #входящие параметры write-host "string = " $string " | integer = " $integer } elimS #вызов функции без определения параметров, параметры примут значение по умолчанию $string = "test string" $integer = 911 elimS $string $integer #так вызывать функцию правильно - разделяем параметры пробелом elimS -integer $integer -string $string #так тоже правильно $global:var1 = "test" - глобальная переменная, таким образом можно передавать значение переменных из функций.
Еще по поводу того, как передавать множество параметров в функцию:
Остальное
get-host #показать версию powershellClear-RecycleBin
c:
-Force #очистка корзины
Compress-Archive
-Path
C:\test\*
-DestinationPath
C:\archive\test1.zip #архивируем папку
Expand-Archive
-Path
C:\temp\test1.zip
'C:\test\New folder\' #рапаковуем архив
(Get-CimInstance Win32_operatingSystem).lastbootuptime #показать время загрузки системы write-host $sleep_array.GetType().FullName #показать тип переменной switch ($a) { #case - множественный if 1 {$b = $b+10 } 2 {$b = $b+20 } 3 {$b = $b+30 } 4 {$b = $b+40 } default {$b = $b+50} } Get-Content -Path "C:\scripts\test.txt" -Wait #аналог tail в linux
Командлеты powershell
Sort-Object — сортирует объекты по возрастанию или по убыванию на основе значений свойств объектов. Можно задать одно свойство или несколько свойств (сортировка по нескольким ключам), а также выбрать сортировку с учетом или без учета регистра. Кроме того, можно сделать так, чтобы командлет Sort-Object выводил только объекты с уникальными значениями того или иного свойства.
Copy-Item — копирует элемент из одного местоположения в пространстве имен в другое. Командлет Copy-Item не удаляет копируемые элементы. Типы элементов, которые может копировать командлет, определяются наличием поставщиков Windows PowerShell. Например, при использовании командлета с поставщиком FileSystem копируются файлы и папки, а при работе с поставщиком реестра копируются разделы и записи реестра.
Move-Item — перемещает элемент, включая его свойства, содержимое и дочерние элементы, из одного местоположения в другое. Оба заданных местоположения должны поддерживаться одним и тем же поставщиком. Например, можно переместить файл или вложенный каталог из одного каталога в другой либо переместить подраздел реестра из одного раздела в другой. При перемещении элемента он удаляется в исходном местоположении и создается в новом.
Remove-Item — удаляет один и более элементов. Данный командлет поддерживается многими поставщиками, поэтому он может удалять элементы различных типов, включая файлы, каталоги, разделы реестра, переменные, псевдонимы и функции.
Get-ChildItem — получает элементы из заданных местоположений. Если элемент является контейнером, данный командлет получает из контейнера элементы, которые называются дочерними элементами. Для извлечения элементов из всех дочерних контейнеров можно использовать параметр Recurse. Местоположение может являться расположением в файловой системе, например каталогом, либо расположением, предоставляемым другим поставщиком, например кустом реестра или хранилищем сертификатов.
Параметры командлетов powershell
-ErrorAction — параметр присутствует во всех командлетах, позволяет задать действие выполняемое при возникновении ошибки:
- Continue — вывести сообщение об ошибке и продолжить выполнение
- SilentlyContinue — проигнорировать ошибку и продолжить
- Stop — при первой же ошибке прервать выполнение
- Inquire — при возникновении ошибки вывести запрос что делать дальше
Пример: Copy-Item «d:\test1\klbackup*» «d:\test2\» -ErrorAction stop
-WhatIf — отображает сообщение, в котором описан результат команды, без фактического ее выполнения. Присутствует во всех командлетах.
get-help about_CommonParameters — описание параметров, которые могут использоваться с любым командлетом.
SSH через Powershell
Пример того, как можно работать через SSH:
#устанавливаем модуль SSH, один раз Find-Module Posh-SSH | Install-Module #Создаем SSH сессию: Import-Module Posh-SSH $ComputerName = "1.2.3.4" $UserName = "ubuntu" $KeyFile = "C:\SSH\key.pem" $nopasswd = new-object System.Security.SecureString $Crendtial = New-Object System.Management.Automation.PSCredential ($UserName, $nopasswd) $SSHSession = New-SSHSession -ComputerName $ComputerName -Credential $Crendtial -KeyFile $KeyFile #Создаем шелл: $SSH = $SSHSession | New-SSHShellStream # отправляет команду $SSH.WriteLine("ifconfig") # считываем ответ $SSH.read() #закрываем сессию: $sshSession | Remove-SSHSession
Команды:
- Get-SSHTrustedHost — посмотреть доверенные хосты
- Get-SSHSession — посмотреть список открытых сессий
- Remove-SSHSession — закрыть сессию
Ссылки:
Копирование файлов между сессиями
Copy-Item — копирование файлов на удаленный ПК. На целевой машине должна работать служба удаленного управления WinRM, которая конфигурируется одной командой:
Enable-PSRemoting
Для подключения к машине в доверенном домене больше ничего не требуется.
В рабочей группе надо на своем ПК добавить целевой компьютер в доверенные узлы по имени ПК или IP-адресу:
#добавить ПК в доверенные узлы Set-Item wsman:localhost\client\trustedhosts -value "192.168.1.113" #убрать ПК из доверенных узлов #Set-Item wsman:localhost\client\trustedhosts -value ""
Дальше вы создаете новую сессию, указывая имя пользователя для подключения к удаленному ПК, и вводите учетные данные. В созданную сессию можно копировать файлы.
$rs = New-PSSession -ComputerName 192.168.1.113 -Credential test-pc\vadim Copy-Item -Path "C:\temp\my.csv" -Destination "C:\temp\" -ToSession $rs
Ссылки по теме PowerShell Remoting:
Управление пакетами (автоустановка программ)
Модуль: PackageManagement
В Windows 10 встроено управление поставщиками пакетов (оно же OneGet), с помощью которого можно тихо установить сразу несколько приложений одной командой! Это похоже на Apt-Get в Linux, но можно провести и параллели с Ninite или InstallPack
Примечание. Можно использовать этот модуль, не устанавливая WMF 5.0. Предварительная версия модуля для PS 4.0 и 3.0 доступна отдельно — март 2016 тут, а более свежие ищите поиском в центре загрузки по запросу PackageManagement PowerShell Modules Preview.
Установка программ
В этом примере из репозитория Chocolatey устанавливаются четыре программы и полный набор утилит Sysinternals. Первые три команды выполняются однократно, причем смену политики надо подтвердить. Четвертая команда тихо устанавливает перечисленные программы, а пятая просто экономит время.
#Разрешить установку подписанных пакетов из Интернета Set-ExecutionPolicy RemoteSigned #Установить поставщик Chocolatey Get-PackageProvider –Name Chocolatey -ForceBootstrap #Сделать Chocolatey доверенным Set-PackageSource -Name Chocolatey -Trusted #Установить программы Install-Package NotepadPlusPlus, vlc, firefox, filezilla, sysinternals -Verbose -Force -ProviderName chocolatey #Добавить путь к исполняемым файлам (sysinternals) в PATH setx PATH "$env:path;C:\Chocolatey\bin" -m
Поставщик скачивает в C:\Chocolatey\lib пакет, в основе которого лежит скрипт chocolateyInstall.ps1. Он загружает установщик программы с официального сайта в папку %temp%\Chocolatey и запускает его в режиме тихой установки. Простейший пример – Notepad++.
Install-ChocolateyPackage 'notepadplusplus' 'exe' '/S' 'https://notepad-plus-plus.org/repository/6.x/6.9/npp.6.9.Installer.exe'
Поиск программ
В репозиториях много программ, все самые популярные точно есть.
Find-Package '*zip*','*commander*' -ProviderName Chocolatey
Удаление программ
Uninstall-Package -name filezilla
В идеале установка и удаление пакета должно повлечь тихое удаление программы, но реализация зависит от автора пакета и возможностей установщика. Бывают случаи когда запускается интерактивная оболочка
Ссылки по теме OneGet и тихой установки:
Установка обновлений Windows через Powershell
- Качаем модуль Windows Update PowerShell Module с сайта microsoft.
- Распаковываем архив в папку %WINDIR%\System32\WindowsPowerShell\v1.0\Modules
- Если еще не разрешали запускать локальные скрипты, то разрешаем это делать: «Set-ExecutionPolicy RemoteSigned».
- Проверить можно при помощи команды «Get-ExecutionPolicy»: должно быть «RemoteSigned» вместо «Restricted»
- Импортируем скачанный модуль командой: «Import-Module PSWindowsUpdate»
- Готово. Теперь можно использовать команды:
- Посмотреть список доступных обновлений: Get-WUInstall -ListOnly
- Установить все обновления не спрашивая подтверждения: Get-WUInstall -AcceptAll
- Установить все обновления не спрашивая подтверждения и отложить перезагрузку: Get-WUInstall -AcceptAll -IgnoreReboot
- Установить определенные обновления зная их номер: «Get-WUInstall -KBArticleID KB3066441, KB3078676 -AcceptAll -IgnoreReboot» — теперь не нужно заходить на сайт microsoft и выкачивать их вручную
- Подробная справка по модулю: get-help Get-WUInstall -detailed
- Посмотреть список доступных обновлений исключив категорию «Language packs», заголовки «Skype» и обновление KB3012973: Get-WUInstall -NotCategory «Language packs» -NotTitle Skype -NotKBArticleID KB3012973 -ListOnly
- Установить обновления исключив категорию «Language packs», заголовки «Skype» и обновление KB3012973: Get-WUInstall -NotCategory «Language packs» -NotTitle Skype -NotKBArticleID KB3012973 -AcceptAll -IgnoreReboot
Примеры PowerShell скриптов
Используемые источники и полезные ссылки
Понравилось? =) Поделись с друзьями:
Сетевые командлеты PowerShell — 🖧 Полигон 218
1. Test-Connection
На замену утилите ping в PowerShell пришел командлет Test-Connection, входящий в состав модуля Microsoft.PowerShell.Management. Для примера пропингуем сервер SRV3 командой:
Test-Connection -ComputerName SRV3
Можно указать для проверки сразу несколько серверов, например перечислив их через запятую:
Test-Connection -ComputerName SRV3, SRV4
или считав из файла:
Test-Connection -ComputerName (Get-Content serverlist.txt)
Еще командлет умеет запускать проверку сразу с нескольких точек. Например, для проверки сервера SRV4 с локального компьютера и с сервера SRV3 воспользуемся следующей командой:
Test-Connection -Source localhost, SRV3 -ComputerName SRV4
Параметр -Source появился только в PS 3.0. В некоторых случаях очень удобно, однако при его использовании может понадобится ввести учетные данные:
Test-Connection -Source localhost, SRV3 -ComputerName SRV4 -Credential Contoso\administrator
Примечание. Командлет использует класс Win32_PingStatus, поэтому для проверки соединения можно воспользоваться командой Get-WmiObject Win32_PingStatus, ее действие аналогично команде Test-Connection.
Следующее средство, обычно применяемое после ping — это трассировка с помощью утилиты tracert. В PowerShell для этих целей можно задействовать командлет Test-NetConnection из модуля NetTCPIP. Не смотря на похожее название, по функционалу он довольно сильно отличается от предыдущего командлета, хотя включает в себя и его возможности. Кроме проверки TCP соединения вывод может включать в себя список IP интерфейсов, разрешение DNS-имен (DNS lookup), правила IPsec и проверку возможности установления соединения. В самом простом варианте команда выглядит так:
Test-NetConnection -ComputerName ya.ru
Для пошагового вывода в стиле tracert можно сделать так:
Test-NetConnection -ComputerName ya.ru -TraceRoute
Также можно указать определенный порт и сделать детализованный вывод:
Test-NetConnection -ComputerName ya.ru -Port 80 -InformationLevel Detailed
2. Get-NetIPConfiguration
Первое, для чего используют Ipconfig — это просмотр сетевых настроек. В PowerShell для этих целей можно воспользоваться командлетом Get-NetIPConfiguration. Так для подробного вывода настроек для всех сетевых интерфейсов (аналог ipconfig /all) введем команду:
Get-NetIPConfiguration -All -Detailed
Для операций с клиентом DNS воспользуется командлетами PowerShell из модуля DNSClient. Для очистки содержимого локального кеша DNS вместо ipconfig /flushdns выполним команду Clear-DnsClientCache, для перерегистрации вместо ipconfig /registerdns — команду Register-DnsClient. Вывести содержимое кеша (ipconfig /displaydns) можно командой Get-DnsClientCache. Также можно выводить не все содержимое кеша, а посмотреть только определенную запись, например:
Get-DnsClientCache -Entry www.bing.ru
3.Resolve-DnsName
Для проверки DNS имен вместо nslookup можно воспользоваться командлетом Resolve-DnsName, входящий в состав модуля DNSClient. Синтаксис у них похожий, например:
Resolve-DnsName -Name SRV3
Можно указать тип записи (A, PTR, SRV), указать, откуда брать данные и выбрать определенный DNS-сервер, отличный от дефолтного:
Resolve-DnsName -Name SRV3 -Type A -DNSOnly -Server 192.168.0.1
4.Get-NetTCPConnection
Утилита Netstat — еще один инструмент сетевой диагностики, показывающий сетевые подключения. Заменим ее командлетом Get-NetTCPConnection. Следующая команда выведет все подключения к интернету, имеющие статус установленных (Established):
Get-NetTCPConnection -State Established -AppliedSettings Internet | ft -auto
5.NetTCPIP
Для управления маршрутизацией вместо утилиты Route воспользуемся несколькими командлетами из модуля NetTCPIP. Для примера попробуем добавить новый постоянный маршрут до сети 172.16.0.0 с маской 255.255.0.0 и шлюзом 192.168.0.1 для интерфейса с номером 3. Вот так это можно сделать с помощью Route:
Route -p add 172.16.0.0 mask 255.255.0.0 192.168.0.1 -if 3
А вот так при использовании PowerShell:
New-NetRoute -DestinationPrefix ″172.16.0.0/16″ -InterfaceIndex 3 -NextHop 192.168.0.1
Для просмотра таблицы маршрутизации вместо route print возьмем командлет Get-NetRoute. Выведем все маршруты для протокола IPv4 командой:
Get-NetRoute -AddressFamily IPv4 | ft -auto
В PS 4.0 появился интересный командлет Find-NetRoute, с помощью которого можно вывести маршрут для одного конкретного IP-адреса, например:
Find-NetRoute -RemoteAddress 10.0.0.1
Для удаления маршрута (вместо route delete) также есть отдельный командлет Remove-NetRoute, например:
Remove-NetRoute -DestinationPrefix ″172.16.0.0/16″ -InterfaceIndex 3 -NextHop 192.168.0.1 -Confirm:$false
Для изменения уже созданного маршрута вместо route change можно воспользоваться связкой Remove-NetRoute&New-NetRoute.
6.Netsh
Утилита Netsh (Network shell) предназначена для выполнения различных задач по настройке сети. Поскольку функционал ее достаточно широк, для сравнения возьмем одну из типичных задач по настройке сетевого интерфейса. Предположим, нам необходимо проверить настройки сетевого интерфейса, и если включен DHCP — отключить его и настроить статическую адресацию. С помощью netsh это будет выглядеть следующим образом:
Netsh interface IPv4 show addresses
Netsh interface IP set address ″Ethernet″ static 192.168.0.11 255.255.255.0 192.168.0.1
Netsh interface IP add DNSServers ″Ethernet″ 8.8.8.8
И тоже самое, но уже с помощью PowerShell:
Get-NetIPAddress -InterfaceIndex 3 -AddressFamily IPv4
Set-NetIPInterface -InterfaceIndex 3 -Dhcp disabled
New-NetIPAddress -InterfaceIndex 3 -IPAddress 192.168.0.11 -PrefixLength 24 -DefaultGateway 192.168.0.1
Set-DNSClientServerAddress -InterfaceIndex3 -ServerAddresses (″8.8.8.8″)
Что интересно, для изменения сетевых настроек придется их удалить и создать заново. Например IP-адрес можно изменить так:
Remove-NetIPAddress -InterfaceIndex 3 -IPAddress 192.168.0.11 -PrefixLength 24 -DefaultGateway 192.168.0.1 -Confirm:$false
New-NetIPAddress -InterfaceIndex 3 -IPAddress 192.168.0.12 -PrefixLength 24 -DefaultGateway 192.168.0.1 -Confirm:$false
Примечание. Для изменения IP-адреса логично было бы воспользоваться специально предназначенным для этого командлетом Set-NetIPAddress, но не тут-то было 🙂 При попытке изменить настройки этот командлет стабильно выдает ошибку. Как выяснилось, этот командлет не может изменить сам IP-адрес, а только некоторые его свойства.
7.Gpupdate и Gpresult
Для обновления групповых политик вместо Gpupdate в модуле GroupPolicy есть командлет Invoke-GPUpdate. Синтаксис у них практически один и тот же, например принудительное обновление политик пользователя выполняется командой:
Gpupdate /target:user /force
Invoke-GPUpdate -Target user -force
Ну и посмотреть результирующие политики вместо Gpresult можно командлетом Get-GPResultantSetOfPolicy. Осуществить вывод результатов в HTML-файл можно командой:
Get-GPResultantSetOfPolicy -ReportType Html -Path C:\gpo.html
CMD vs PowerShell
Как видите, PowerShell вполне в состоянии заменить большинство утилит командной строки. Однако остается еще один вопрос — зачем это нужно.
В достоинства PowerShell, на мой взгляд, можно записать более структурированный вывод результатов, которые к тому-же можно обрабатывать — фильтровать, сортировать и изменять формат вывода. Кроме того, результатом выполнения команд PowerShell являются объекты, которые можно сохранять в переменные, передавать по конвейеру и т.п. Это очень удобно при написании скриптов.
Из недостатков — большинство описанных в статье команд требуют PowerShell 3.0, а некоторые вообще есть только в четвертой версии. Также некоторые командлеты (напр. Set-NetIPAddress) работают криво не совсем так, как должны.
Ну а на стороне CMD проверенный временем функционал, который есть в любой версии Windows. Кроме того, для простых задач администрирования cmd использовать привычнее, а где-то и удобнее.
Итак, что же лучше — CMD или PowerShell ? Не знаю как вы, а я не готов однозначно ответить на этот вопрос. Впрочем, ничто не мешает нам пользоваться и тем и другим.
Powershell Test-Path Возвращает Значение False При Тестировании Общего Сетевого Ресурса
КОРОТКИЙ ОТВЕТ
if(-Not(Test-Path "filesystem::\\$server\c$")) {Write-Error "Server not found: $server"; continue}
if(-Not(Test-Path "filesystem::\\$server\c$")) {Write-Error "Server not found: $server"; continue}
Если Test-Path не удался неожиданно, убедитесь, что SMB2 = 1 (или другой параметр SMB) установлен как на клиентском, так и на целевом сервере.
БОЛЬШЕ ИНФОРМАЦИИ
ВАЖНОЕ ПРИМЕЧАНИЕ SMB: и текущая система, и целевая система должны иметь хотя бы общий протокол SMB, разрешенный для успешного прохождения Test-Path. (Настоятельно рекомендуется использовать SMB2 или более позднюю версию.) Например, если для цели включен SMB1 + SMB2 отключен, а на клиенте включена только SMB2, то приведенная выше логика вернет сообщение «Сервер не найден…». Это сбивало меня с толку, пока я наконец не проверил свой целевой сервер (Win7) и не обнаружил, что у него SMB2 = 0 (отключено) и нет записи для SMB1 (по умолчанию включено). Я исправил, установив SMB2 = 1 для статьи ниже.
Сведения об ОС SMB и подробности сценариев: https://support.microsoft.com/en-us/help/2696547/detect-enable-disable-smbv1-smbv2-smbv3-in-windows-and-windows-server
Выдержка: Win8/Win20012
Detect: Get-SmbServerConfiguration | Select EnableSMB1Protocol
Disable: Set-SmbServerConfiguration -EnableSMB1Protocol $false
Enable: Set-SmbServerConfiguration -EnableSMB1Protocol $true
Выдержка: Win7/Win2008R2Server
Detect:
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
Default configuration = Enabled (No registry key is created), so no SMB1 value will be returned
Disable:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force
Enable:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force
Пример кода: Copy-Item папка (рекурсивная), только если целевой сервер существует
$scriptRootPath="."
$scriptToolsPath="$scriptRootPath\Tools"
$targetServerList="$scriptToolsPath\DeployServerList-INT-POC.txt" #DeployServerList-INT.txt, DeployServerList-QA.txt, DeployServerList-PROD.txt
$stageTargetDrive="c"
$stageFolderPath="$stageTargetDrive$\staging"
$VerbosePreference="Continue" #"SilentlyContinue" (default), "Continue", "Stop", "Inquire"
$InformationPreference="Continue"
Write-Host "Getting list of servers from $targetServerList to stage deployment files to..."
$serverList = (get-content "$targetServerList")
Write-Verbose "scriptToolsPath=$scriptToolsPath"
Write-Verbose "serverlist=$serverList"
Write-Verbose "stageFolderPath=$StageFolderPath"
Write-Host -Separator "-"
Read-Host -Prompt "READY TO STAGE FILES: Check info above, then press Enter to continue (or Ctrl+C to exit)."
Write-Host "-------------------------------------------------"
Write-Host "Staging files to $stageFolderPath on each target server..."
foreach ($server in $serverlist) {
# Input validation
if([string]::IsNullOrWhiteSpace($server)) {continue}
if($server.StartsWith("#")) {Write-Verbose "Comment skipped: $server"; continue} # Skip line if line begins with hashtag comment char
Write-Verbose "Testing filesystem access to $server..."
if(-Not(Test-Path "filesystem::\\$server\$stageTargetDrive$")) {Write-Error "Server not found: $server"; continue}
# TIP: If Test-Path returns false unexpectedly then check if SMB2 is enabled on target server, check SMB1 disabled for both src and target servers.
Write-Verbose "Staging files to $server..."
Copy-Item ".\" -Destination "\\$server\$stageFolderPath" -Recurse -Force -ErrorAction Continue
Write-Information "Files staged on $server."
}
Test-Path: Мы обманули | PowerShell
PowerShell Team
Test-Path: We Goofed!
(также известный как опечатка в документации …)
Test-Path — очень удобный небольшой командлет. Вы отправляете путь, и он сообщает вам (ИСТИНА / ЛОЖЬ), существуют ли элементы пути на компьютере. Вы можете использовать его для определения наличия (или отсутствия) определенных файлов или папок или для поиска раздела реестра, который указывает на то, что программа установлена, а также для многих других целей.
Моя любимая команда Test-Path напоминает мне, когда я забыл скопировать свой профиль Windows PowerShell на одну из моих тестовых машин (test-path $ profile).
Test-Path настолько хорош, что не было необходимости преувеличивать его возможности в документации, но мы это сделали. Следующий оператор false появляется в описании значения Leaf параметра PathType:
«Элемент, не содержащий других элементов, таких как файл или запись реестра .
Это неправда. Файл, да; запись в реестре, нет.
Test-Path может обнаружить ключи реестра (контейнеры), но не может обнаружить записи реестра (иногда называемые «значениями») или данные в записи. Если вы попробуете, он всегда вернет ЛОЖЬ.
‘Тестирование раздела реестра
C: \ PS> test-path HKLM: \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell
True
‘ Тестирование записи реестра
C: \ PS> test-path HKLM: \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell \ ExecutionPolicy
False
‘Поиск записи реестра
C: \ PS> get-itemproperty -name ExecutionPolicy -path HKLM: \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell
PSPath: Microsoft.Power. Core \ Registry :: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Micro
soft.PowerShell
PSParentPath: Microsoft.PowerShell.Core \ Registry :: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ PSCIds.PowerShell
PSDrive: HKLM
PSProvider: Microsoft.PowerShell.Core \ Registry
ExecutionPolicy: RemoteSigned
(Вы используете завершение TAB на этих путях, верно?)
Я исправил документы и добавил пример демонстрируя это ограничение. Вы увидите это в следующем выпуске Windows PowerShell.
Я очень благодарен любезному пользователю, сообщившему об этой ошибке. Если вы обнаружите ошибку (или любую другую проблему) с документами, сообщите об этом, следуя инструкциям ЗДЕСЬ. Во-первых, я буду искренне раскаиваться, а затем исправлю это, но буду бесконечно благодарен.
June Blender [MSFT]
Senior Programming Writer
Windows PowerShell
Как использовать Test-Path в сценариях PowerShell — Статьи TechNet — США (английский)
Вы можете использовать командлет Windows PowerShell Test-Path, чтобы избежать ненужных ошибок в ваших сценариях, вызванных тем, что что-то находится не там, где вы их ожидаете, или другой частью вашего сценария, возвращающей недопустимый «путь».
Так, например, мы можем проверить, существует ли $ profile:
Test-Path $ profile
И если у вас есть $ profile, это возвращает True, а если нет, возвращает False.Все идет нормально. Предположим, я хочу знать, существует ли вообще путь для моего профиля $? Тогда мы можем использовать:
Test-Path (профиль $ split-path)
Которая будет работать почти все время. Он даст вам неправильный ответ, если у вас есть ФАЙЛ, в котором должен находиться каталог вашего профиля. Итак, чтобы обойти это, мы делаем:
Контейнер Test-Path -pathtype (профиль Split-Path $)
Итак, как использовать Test-Path? Что ж, в качестве простого примера у меня есть стандартный профиль, который я использую на всех своих машинах, но я постоянно создаю новые виртуальные машины для специализированных тестовых сред.На новом компьютере каталога для профиля $ еще нет,
поэтому простая копия не будет работать. Вместо этого я использую:
# Сначала убедитесь, что u: сопоставлен с моим домашним каталогом
если
(! (Test-path -isvalid u: \ WindowsPowerShell)) {
нетто
использовать
u: \\ сервер \ charlie
}
# Теперь создайте каталог $ profile
если
не существует
$ proDir
= (разделенный путь
$ профиль
)
если
(! (Test-path -pathtype container
$ proDir
)) {
мкдир
$ proDir
Процессор: / WindowsPowerShell / *
$ proDir
}
еще
{
Процессор: / WindowsPowerShell / *
$ proDir
}
Обратите внимание на этот первый тест с использованием переключателя -isValid на Test-Path.Ключ -isValid возвращает True, если путь синтаксически правильный. И он должен вернуть True, поскольку синтаксически нет ничего неправильного в пути «U: \ WindowsPowerShell». Но вот я беру
преимущество того, что некоторые считают ошибкой в Test-Path, но я думаю, что это именно то, как поставщик файловой системы обращается с ней. Если диска не существует, тогда
test-path -isValid вернет False, даже если путь будет приемлемым, если бы диск был сопоставлен.
Важное предупреждение об использовании переключателя -isValid.Если бы я использовал его на новом компьютере, на котором еще не было моего профиля, он все равно вернул бы True, поскольку в пути нет ничего синтаксически неправильного. Так
Test-Path -isValid $ profile всегда будет возвращать значение true.
См. Также
Основы PowerShell: Test-Path — Check if File Exists
PowerShell Test-Path Cmdlet
Если есть проблема с поиском файла или проверкой объекта контейнера, то вызовите Test-Path PowerShell; он ответит «Верно или Неверно».
Классический пример: PowerShell проверяет, существует ли файл
Начните с простого сценария, чтобы проверить наличие файла.
# PowerShell Проверить, существует ли файл $ WantFile = "C: \ Windows \ explorer.exe" Test-Path $ WantFile
Примечание 1: Единственный результат, который может вернуть PowerShell, — истина или ложь. Однако Test-Path требует, чтобы оператор «if» действовал на вывод, таким образом: —
# PowerShell проверяет, существует ли файл $ WantFile = "C: \ Windows \ explorer.исполняемый" $ FileExists = Test-Path $ WantFile Если ($ FileExists -eq $ True) {Write-Host "Yippee"} Else {Write-Host "В этом месте нет файла"}
Примечание 2: Как и все эти сценарии, пожалуйста, измените мои примеры, чтобы они соответствовали вашей среде.
Парень рекомендует: Утилита SolarWinds Wake-On-LAN (БЕСПЛАТНЫЙ ИНСТРУМЕНТ)
Принуждение компьютеров к переходу в спящий режим, когда они не используются, — отличная идея — до тех пор, пока вы не отойдете от рабочего стола и вам понадобится файл на этом пульте спальная машина!
WOL также используется в бизнесе, например, для пробуждения компьютеров, чтобы к ним можно было применить обновления.Моя настоящая причина, по которой я рекомендую вам загрузить этот бесплатный инструмент, заключается в том, что отправлять эти «волшебные пакеты» очень весело. Попробуйте WOL — это бесплатно.
SolarWinds Wake-On-LAN Загрузите 100% БЕСПЛАТНО инструмент
Переменные среды Test-Path
В дополнение к физическому расположению файлов вы также можете использовать Test-Path для опроса реестра или, как здесь, переменных среды.
# Путь тестирования PowerShell для переменных среды Test-Path env: \ PathExt
Задача: Какие из них на самом деле являются переменными среды?
Public, Private, Temp, Tump и Tmp
PowerShell Test-Path -IsValid
Одно из недооцененных заданий для Test-Path — проверка того, что часть пути скрипта действительно существует.
# Сценарий PowerShell для проверки допустимого пути Clear-Host $ ImageFiles = "H: \ Sports \ fun_pictures \" $ ValidPath = Test-Path $ ImageFiles -IsValid Если ($ ValidPath -eq $ True) {Write-Host "Путь в порядке"} Else {Write-Host "Ошибка в переменной ImageFiles"}
PowerShell Test-Path -Exclude
Вот реальная проблема, я хотел посмотреть, есть ли какие-либо файлы, отличные от .gif, pnp, bmp или .jpg, которые смешались с моей коллекцией фотографий. Предположение: интересующие меня (нас) файлы хранятся в H: \ Sports \ fun_pictures \
# Скрипт для проверки неправильного формата изображения.Clear-Host $ ImageFiles = "H: \ Sports \ fun_pictures \ *. *" $ RogueExists = Test-Path $ ImageFiles ` - исключить * .jpg, * .gif, * .png, * .bmp If ($ RogueExists -eq $ True) {Write-Host `" Изображения не .jpg .gif .png .bmp "} Else {Write-Host "Нет неизвестных форматов."}
Примечание 3: Вам придется радикально отредактировать вышеуказанный файл, если вы хотите, чтобы он работал на вашем компьютере. Измените значения для $ ImageFiles, а также настройте расширения файлов -exclude. Подробнее о PowerShell Else.
Guy рекомендует: SolarWinds Engineer’s Toolset (БЕСПЛАТНАЯ ПРОБНАЯ ПЕРЕДАЧА)
Этот Engineer’s Toolset предоставляет комплексную консоль из 50 утилит для устранения компьютерных проблем. Гай говорит, что это помогает мне отслеживать, что происходит в сети, и каждый инструмент учит меня больше о том, как работает основная система.
Есть так много хороших гаджетов; это все равно, что получить полную свободу действий в магазине сладостей. К счастью, утилиты отображаются логично: мониторинг, обнаружение сети, диагностика и инструменты Cisco.Попробуйте 14-дневную бесплатную пробную версию SolarWinds Engineer’s Toolset прямо сейчас!
SolarWinds Engineer’s Toolset Загрузить 14-дневную БЕСПЛАТНУЮ пробную версию
Пример тестового пути, который заставит вас задуматься
# PowerShell Test-Path Cmdlet -Exclude Clear-Host $ WantFile = "C: \ Windows \. *" $ FileExists = Test-Path -Path $ WantFile -Exclude *. * Если ($ FileExists -eq $ True) {Write-Host "Yippee"} Else {Write-Host "В этом месте нет файла"}
Note 4: Я создал этот скрипт намеренно.С практической точки зрения это не имеет смысла. Измените значение Exclude *. * На * .exe или * .dll. Как видите, в пути и в расширениях разрешены подстановочные знаки.
Примечание 5: Здесь я явно использовал параметр -Path, однако любое значение после Test-Path считается местоположением, поэтому -Path является необязательным.
Примечание 6: Я часто обнаруживаю, что эксперименты с Get-ChildItem вместе с Test-Path выявляют сильные и слабые стороны этих двух командлетов.
Исследование командлета PowerShell Test-Path
# Узнайте больше о командлете PowerShell Test-Path Clear-Host Get-Help Test-Path -full
Примечание 7: Запрашивая Test-Path с помощью Get-Help, мы можем найти полезные параметры, такие как -IsValid, для проверки пути. Также есть -Include и -exclude, которые уточняют содержание вашего поиска. Именно благодаря Get-Help я обнаружил -PathType.
Test-Path -PathType
Основная цель параметра -PathType — проверить, является ли объект файлом или папкой.Однако его также можно использовать в реестре для проверки ключей или данных.
Clear-Host $ Location = 'HKLM: \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon' Контейнер Test-Path $ Location -PathType
Trap: HKLM : требуется это двоеточие. Если вы просто экспортируете области реестра, то копируете как:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon
, есть проблемы.
HKEY_LOCAL_MACHINE в порядке, пространство между Windows и NT — не проблема, но отсутствие двоеточия — препятствие, оно должно быть:
HKEY_LOCAL_MACHINE : \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon
Гай рекомендует: Network Performance Monitor (БЕСПЛАТНЫЙ ПРОБНЫЙ ПЕРИОД)
SolarWinds Network Performance Monitor ( NPM) поможет вам обнаружить, что происходит в вашей сети.Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.
Что мне больше всего нравится, так это то, как NPM предлагает решения сетевых проблем. Он также имеет возможность отслеживать состояние отдельных виртуальных машин VMware. Если вы заинтересованы в устранении неполадок и создании сетевых карт, я рекомендую вам попробовать NPM в 30-дневной бесплатной пробной версии.
SolarWinds Network Performance Monitor Скачать 30-дневную БЕСПЛАТНУЮ пробную версию
Остальное семейство путей
Вот простой метод поиска дополнительных командлетов.Get-Command -Noun часто дает интересные результаты, например, Resolve-Path.
# Исследование командлета пути PowerShell Clear-Host Get-Command -Noun Path
Convert-Path
Join-Path
Resolve-Path
Split-Path
Test-Path
Пример пути соединения
Вот красивый сценарий, чтобы определить, на каком диске находится конкретная папка.
Clear-Host $ Folder = "Материал" Get-PSDrive | Where-Object { $ _. root -match "[C-Z]: \\" -and (Test-Path $ (Join-Path $ _.корневая папка $)) }
Примечание 8: Измените «Stuff» на имя просматриваемой папки.
Powershell Test-Path output -eq «False» не работает
Переполнение стека
- Около
Товары
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
Test-Path — PowerShell — SS64.com
Test-Path — PowerShell — SS64.com
Возвращает истину, если путь существует; в противном случае возвращает ложь, определяет, все ли элементы пути существуют.
Синтаксис Test-Path { [-path] string [] | [-literalPath] строка [] } [-pathType TestPathType ] [-isValid] [-include string []] [-exclude string []] [-Filter string ] [-credential PSCredential ] [-UseTransaction] [ CommonParameters ] Ключ -Path строка [] Путь (или пути) PowerShell для тестирования Подстановочные знаки разрешены.{может быть трубопроводным} -LiteralPath строка Как и в случае с Path, указанным выше, только значение используется точно так, как было введено. Никакие символы не интерпретируются как подстановочные знаки. Если путь включает какие-либо Затем escape-символы заключают путь в одинарные кавычки. -PathType TestPathType Одно из: Контейнер, Лист или Любой Контейнер = родительский контейнер элемента (родительская папка) Лист = последний элемент или контейнер на пути.(имя файла) Любой = Либо контейнер, либо лист. -является действительным Вернуть ИСТИНА, если синтаксис пути допустим, даже если элементы пути не существует. -включить строку Проверяйте только указанные элементы из Пути. например "Май*" это работает, только если путь включает подстановочный знак. -Исключить строку Пропустите указанные элементы из пути, например "* SS64 *" это работает, только если путь включает подстановочный знак.-Фильтр строка Фильтр в формате или языке провайдера. Значение этого параметра определяет параметр Path. Точный синтаксис фильтра (поддержка подстановочных знаков и т. Д.) Зависит от поставщика. Фильтры более эффективны, чем -include / -exclude, потому что поставщик применяет фильтр при извлечении объектов вместо того, чтобы PowerShell фильтрует объекты после их получения. -Credential PSCredential Используйте учетные данные для проверки доступа к файлу. Учетные данные представляют имя пользователя, например "User64" или "Domain64 \ User64", или PSCredential объект, например, полученный с помощью командлета Get-Credential. Если вы введете имя пользователя, вам будет предложено ввести пароль. Этот параметр не поддерживается основными командлетами или поставщиками PowerShell. -UseTransaction Включите команду в активную транзакцию.
Test-Path вернет либо $ true, либо $ false.
Test-Path будет правильно проверять наличие или отсутствие допустимой строки пути, но если вы попросите его проверить путь, который равен $ null или строке нулевой длины, он вернет ошибку. Вы захватываете такие пустые / пустые переменные с помощью оператора Try, например:
$ TestPath = $ null if ($ ( Попробуйте {Test-Path $ TestPath.trim ()} Catch {$ false} ) ) { write-host "Путь ОК" } Else { write-host "Путь не найден" }
Ошибки
Текущая версия Test-Path всегда будет возвращать $ true для пути, состоящего из одного пробела «»
Чтобы предотвратить эту обрезку () строку, которую вы передаете в Test-Path.
Test-Path не работает правильно со всеми поставщиками PowerShell. Например, вы можете использовать Test-Path для проверки пути к разделу реестра , но если вы используете его для проверки пути к записи реестра , он всегда возвращает FALSE, даже если запись в реестре присутствует.
Примеры
Определить, все ли элементы (папки) в пути существуют:
PS C: \> test-path «F: \ MSSQL \ BACKUP»
Определите, есть ли в папке электронных таблиц какие-либо файлы, кроме.xlsx файлов:
PS C: \> тестовый путь C: \ Spreadsheets \ * -exclude * .xlsx
Определите, ведет ли путь, хранящийся в переменной $ profile, к каталогу или к файлу:
PS C: \> test-path $ profile -pathtype лист
Если папки не существует, создайте ее:
$ folder = «F: \ BACKUP»
if (-Нет ( Test-Path $ folder.trim () ) )
{
New-Item -Path $ folder -ItemType Directory
}
«Я не хочу показаться, что я хвастаюсь, но я думаю, что наконец-то мне удалось сыграть пластинку на нужной скорости» ~ Джон Пил
Связанные командлеты PowerShell:
Convert-Path — Преобразует путь ps в путь провайдера.
join-path — объединить путь и дочерний путь.
Resolve-Path — разрешает подстановочные знаки в пути.
Split-Path — Возвращает часть пути.
Get-Help about_namespace.
Эквивалентная команда bash: test — оценить условное выражение.
Авторские права © 1999-2020 SS64.com
Некоторые права защищены.
Командлет Test-Path PowerShell | CloudAffaire
Всем привет
Добро пожаловать в CloudAffaire, а это Дебджит.
В последнем сообщении блога мы обсудили командлеты Get-Location и Set-Location в PowerShell.
https://cloudaffaire.com/powershell-get-location-and-set-location-cmdlet/
В этом сообщении блога мы обсудим командлеты Test-Path в PowerShell. Вы можете использовать командлет Test-Path, чтобы проверить, существует ли элемент по определенному пути. Используя командлет Test-Path, вы можете проверить, существует ли такой элемент, как раздел реестра, файл, каталог или переменная. Командлет Test-Path возвращает $ True, если элемент существует, и $ False, если элемент отсутствует. Вы также можете проверить, создан ли элемент по прошествии определенного времени, используя аргументы «NerwerThan» и «OlderThan».
Синтаксис командлета Test-Path:
## Test-Path
## [-Path]
## [-Фильтр
## [-Include
## [-Exclude
## [-PathType
## [-Является действительным]
## [-Credential
## [-UseTransaction]
## [-OlderThan
## [-NewerThan
## [<Общие параметры>]
## Test-Path ## [-Path] ## [-Filter ## [-Include ## [-Exclude ## [- PathType ## [-IsValid] ## [-Credential ## [-UseTransaction] ## [-OlderThan er ## [ |
Список аргументов командлета Test-Path:
- — Учетные данные : выдавать себя за другого пользователя или повышать свои учетные данные.
- – Исключить : указывает элементы, которые этот командлет пропускает. Значение этого параметра определяет параметр Path.
- — Фильтр : Задает фильтр в формате или на языке поставщика. Значение этого параметра определяет параметр Path.
- – Включить : указывает пути, которые проверяет этот командлет. Значение этого параметра определяет параметр Path.
- – IsValid : указывает, что этот командлет проверяет синтаксис пути независимо от того, существуют ли элементы пути.
- – LiteralPath : указывает путь для тестирования. В отличие от Path, значение параметра LiteralPath используется точно так, как оно набрано.
- — NewerThan : укажите время как объект DateTime.
- – OlderThan : укажите время как объект DateTime.
- – Путь : указывает путь для тестирования. Подстановочные знаки разрешены. Если путь включает пробелы, заключите его в кавычки.
- — PathType : указывает тип последнего элемента пути.Этот командлет возвращает $ True, если элемент имеет указанный тип, и $ False, если это не так. Допустимые значения для этого параметра:
- Контейнер : элемент, содержащий другие элементы, такие как каталог или раздел реестра.
- Leaf : элемент, не содержащий других элементов, например файл.
- Любой : либо контейнер, либо лист.
- – UseTransaction : включает команду в активную транзакцию.Этот параметр действителен только тогда, когда транзакция выполняется.
Командлет тестового пути PowerShell:
Проверьте, существует ли каталог в PowerShell:
###################################
## PowerShell | Командлет | Test-Path ##
####################################
## PowerShell Последняя версия (5)
## проверить, существует ли каталог в PowerShell
Test-Path -Path «C: \ MyDir \» ## возвращает False
################################### ## PowerShell | Командлет | Test-Path ## ################################### ## PowerShell Последние версии Версия (5) ## проверьте, существует ли каталог в PowerShell Test-Path -Path «C: \ MyDir \» ## возвращает False |
Создайте каталог, если он еще не существует в PowerShell:
## создать каталог, если он еще не существует в PowerShell
если (! (Test-Path -Path «C: \ MyDir \»))
{
Новый элемент -ItemType Directory -Path C: \ -Name MyDir
}
Test-Path -Path «C: \ MyDir \» ## возвращает True
## создать каталог, если он еще не существует в PowerShell if (! (Test-Path -Path «C: \ MyDir \»)) { New-Item -ItemType Directory -Path C: \ -Name MyDir } Test-Path -Path «C: \ MyDir \» ## возвращает True |
Проверьте, существует ли файл в PowerShell:
## проверить, существует ли файл в PowerShell
Test-Path -Path «C: \ MyDir \ Myfile.txt «## возвращает false
## проверьте, существует ли файл в PowerShell Test-Path -Path «C: \ MyDir \ Myfile.txt» ## возвращает False |
Создать файл, если он еще не существует в PowerShell:
## создать файл, если он еще не существует в PowerShell
если (! (Test-Path -Path «C: \ MyDir \ MyFile.txt»))
{
Новый элемент -ItemType Directory -Path C: \ MyDir -Name MyFile.текст
}
Test-Path -Path «C: \ MyDir \ MyFile.txt» ## возвращает True
## создать файл, если он еще не существует в PowerShell if (! (Test-Path -Path «C: \ MyDir \ MyFile.txt»)) { New-Item -ItemType Directory — Путь C: \ MyDir -Name MyFile.txt } Test-Path -Path «C: \ MyDir \ MyFile.txt» ## возвращает True |
Проверить, объявлена ли переменная в PowerShell:
## проверить, объявлена ли уже переменная в PowerShell
Test-Path -Path Variable: MyVar ## возвращает False
## проверить, объявлена ли переменная в PowerShell Test-Path -Path Variable: MyVar ## возвращает False |
Объявить переменную, если она еще не объявлена в PowerShell:
## создать переменную, если она еще не существует в PowerShell
Если (! (Test-Path -Path Variable: MyVar))
{
$ MyVar = «CloudAffaire»
}
Test-Path -Path Variable: MyVar ## возвращает True
## создать переменную, если она еще не существует в PowerShell If (! (Test-Path -Path Variable: MyVar)) { $ MyVar = «CloudAffaire» } Test-Path -Path Variable: MyVar ## возвращает True |
Проверьте, существует ли запись реестра в PowerShell:
## проверьте, существует ли раздел реестра в PowerShell
Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает false
## проверьте, существует ли раздел реестра в PowerShell Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает false |
Создайте ключ реестра, если он еще не существует в PowerShell:
## создайте раздел реестра, если он еще не существует в PowerShell
если (! (Test-Path -Path HKCU: \ Software \ MyRegKey))
{
New-Item -Path HKCU: \ Software -Name MyRegKey -Value «CloudAffaire»
}
Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает True
## создать раздел реестра, если он еще не существует в PowerShell if (! (Test-Path -Path HKCU: \ Software \ MyRegKey)) { New-Item -Path HKCU: \ Software — Имя MyRegKey -Value «CloudAffaire» } Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает True |
Проверьте, создается ли каталог или файл до или после определенного времени в PowerShell:
## проверить, создан ли файл или каталог по прошествии определенного времени
$ time = [DateTime] :: Сегодня.AddDays (-1) ## получить DateTime на 1 день назад с сегодняшнего дня
Test-Path -Path C: \ MyDir -NewerThan $ time ## возвращает True
Test-Path -Path C: \ MyDir -OlderThan $ time ## возвращает False
## проверить, был ли файл или каталог создан по прошествии определенного времени $ time = [DateTime] :: Today.AddDays (-1) ## получить DateTime на 1 день назад с сегодняшнего дня Test-Path -Path C: \ MyDir -NewerThan $ time ## возвращает True Test-Path -Path C: \ MyDir -OlderThan $ time ## возвращает False |
Удаление файла, если он уже существует в PowerShell:
## удалить файл, если он существует в PowerShell
если ((Test-Path -Path C: \ MyDir \ MyFile.текст))
{
Remove-Item -Path C: \ MyDir \ MyFile.txt
}
Test-Path -Path C: \ MyDir \ MyFile.txt ## возвращает False
## удалить файл, если он существует в PowerShell if ((Test-Path -Path C: \ MyDir \ MyFile.txt)) { Remove-Item -Path C: \ MyDir \ MyFile. txt } Test-Path -Path C: \ MyDir \ MyFile.txt ## возвращает False |
Удаление каталога, если он уже существует в PowerShell:
## удалить каталог, если он существует в PowerShell
если ((Test-Path -Path C: \ MyDir))
{
Удалить элемент -Путь C: \ MyDir -Force -Recurse
}
Test-Path -Path C: \ MyDir ## возвращает False
## удалить каталог, если он существует в PowerShell if ((Test-Path -Path C: \ MyDir)) { Remove-Item -Path C: \ MyDir -Force -Recurse } Test-Path -Path C: \ MyDir ## возвращает false |
Удалите ключ реестра, если он уже существует в PowerShell:
## удалить раздел реестра, если он существует в PowerShell
если ((Test-Path -Path HKCU: \ Software \ MyRegKey))
{
Remove-Item -Path HKCU: \ Software \ MyRegKey
}
Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает false
## удалить раздел реестра, если он существует в PowerShell if ((Test-Path -Path HKCU: \ Software \ MyRegKey)) { Remove-Item -Path HKCU: \ Software \ MyRegKey } Test-Path -Path HKCU: \ Software \ MyRegKey ## возвращает false |
Удалить переменную, если она уже объявлена в PowerShell:
## удалить переменную, если она уже существует в PowerShell
if ((Test-Path -Path Variable: MyVar))
{
Remove-Item -Path Переменная: MyVar
}
Test-Path -Path Variable: MyVar ## возвращает False
## удалить переменную, если она уже существует в PowerShell if ((Test-Path -Path Variable: MyVar)) { Remove-Item -Path Variable: MyVar } Test-Path -Path Variable: MyVar ## возвращает False |
Надеюсь, вам понравилась эта статья.