Remove item без подтверждения

Remove item без подтверждения

Я запускаю следующую команду:

Который очень часто меня спрашивает:

Как я могу установить его автоматически на "A"?

Попробуйте использовать параметр -Force на Remove-Item .

Добавьте -confirm: $false , чтобы подавить подтверждение.

По умолчанию: нет приглашения.

Вы можете включить его с помощью -confirm или отключить его с помощью -confirm:$false

Однако он все равно будет запрашивать, когда цель:

  • — это каталог
  • и не пуст
  • и параметр -recurse не указан.

Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows. Navigating through Windows PowerShell drives and manipulating the items on them is similar to manipulating files and folders on Windows physical disk drives. В этом разделе мы обсудим выполнение конкретных задач по управлению файлами и папками с помощью PowerShell. This section discusses how to deal with specific file and folder manipulation tasks using PowerShell.

Получение списка файлов и папок, содержащихся в папке Listing All the Files and Folders Within a Folder

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem. You can get all items directly within a folder by using Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Add the optional Force parameter to display hidden or system items. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows): For example, this command displays the direct contents of Windows PowerShell Drive C (which is the same as the Windows physical drive C):

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX. The command lists only the directly contained items, much like using Cmd.exe’s DIR command or ls in a UNIX shell. Для показа вложенных элементов необходимо также указать параметр -Recurse. In order to show contained items, you need to specify the -Recurse parameter as well. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите: (This can take an extremely long time to complete.) To list everything on the C drive:

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Get-ChildItem can filter items with its Path, Filter, Include, and Exclude parameters, but those are typically based only on name. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью командлета Where-Object. You can perform complex filtering based on other properties of items by using Where-Object.

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт: The following command finds all executables within the Program Files folder that were last modified after October 1, 2005 and which are neither smaller than 1 megabyte nor larger than 10 megabytes:

Копирование файлов и папок Copying Files and Folders

Копирование выполняется с помощью командлета Copy-Item. Copying is done with Copy-Item. Следующая команда создает резервную копию C:oot.ini в C:oot.bak: The following command backs up C:oot.ini to C:oot.bak:

Если целевой файл уже существует, то попытка копирования завершается неудачей. If the destination file already exists, the copy attempt fails. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force. To overwrite a pre-existing destination, use the Force parameter:

Эта команда работает, даже если целевой объект доступен только для чтения. This command works even when the destination is read-only.

Читайте также:  Acpi ven atml dev 1000

Так же выполняется и копирование папок. Folder copying works the same way. Эта команда рекурсивно копирует папку "C: emp est1" в новую папку "c: empDeleteMe". This command copies the folder C: emp est1 to the new folder C: empDeleteMe recursively:

Можно также скопировать избранные элементы. You can also copy a selection of items. Следующая команда копирует все файлы .txt, содержащиеся в папке "c:data", в папку "c: emp ext": The following command copies all .txt files contained anywhere in c:data to c: emp ext:

Для копирования элементов файловой системы можно использовать и другие средства. You can still use other tools to perform file system copies. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. XCOPY, ROBOCOPY, and COM objects, such as the Scripting.FileSystemObject, all work in Windows PowerShell. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:oot.ini в файле C:oot.bak: For example, you can use the Windows Script Host Scripting.FileSystem COM class to back up C:oot.ini to C:oot.bak:

Создание файлов и папок Creating Files and Folders

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Creating new items works the same on all Windows PowerShell providers. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента. If a Windows PowerShell provider has more than one type of item—for example, the FileSystem Windows PowerShell provider distinguishes between directories and files—you need to specify the item type.

Эта команда создает папку "C: empNew Folder": This command creates a new folder C: empNew Folder:

Эта команда создает пустой файл "C: empNew Folderfile.txt": This command creates a new empty file C: empNew Folderfile.txt

Удаление всех файлов и папок, содержащихся в папке Removing All Files and Folders Within a Folder

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. You can remove contained items using Remove-Item, but you will be prompted to confirm the removal if the item contains anything else. Например, при попытке удаления папки C: empDeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки: For example, if you attempt to delete the folder C: empDeleteMe that contains other items, Windows PowerShell prompts you for confirmation before deleting the folder:

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse: If you do not want to be prompted for each contained item, specify the Recurse parameter:

Подключение локальной папки как диска Mapping a Local Folder as a drive

Подключить локальную папку можно с помощью команды New-PSDrive. You can also map a local folder, using the New-PSDrive command. Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell: The following command creates a local drive P: rooted in the local Program Files directory, visible only from the PowerShell session:

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell. Just as with network drives, drives mapped within Windows PowerShell are immediately visible to the Windows PowerShell shell. Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist. In order to create a mapped drive visible from File Explorer, the parameter -Persist is needed. Но с этим параметром можно использовать только удаленные пути. However, only remote paths can be used with Persist.

Читайте также:  Активация easeus data recovery wizard

Чтение текстового файла в массив Reading a Text File into an Array

Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. One of the more common storage formats for text data is in a file with separate lines treated as distinct data elements. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее. The Get-Content cmdlet can be used to read an entire file in one step, as shown here:

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла. Get-Content already treats the data read from the file as an array, with one element per line of file content. Убедиться в этом можно, проверив свойство Length полученного содержимого: You can confirm this by checking the Length of the returned content:

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. This command is most useful for getting lists of information into Windows PowerShell directly. Например, можно хранить в файле "C: empdomainMembers.txt" список имен компьютеров или IP-адресов по одному имени на каждую строку файла. For example, you might store a list of computer names or IP addresses in a file C: empdomainMembers.txt, with one name on each line of the file. Можно использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers: You can use Get-Content to retrieve the file contents and put them in the variable $Computers:

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера. $Computers is now an array containing a computer name in each element.

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

Предназначен для эмуляции выполнения команды и вывода информации, о том, что бы случилось, если выполнить данную команду без этого параметра. Для примера можете посмотреть вывод команды:

Если ваш скрипт выполняет какие-то деструктивные действия, имеет смысл включить этот параметр в ваш скрипт для возможности проверки, что будет выполнено именно то, что нужно.

Если ваш скрипт выполняет какие-то серьёзные и/или деструктивные действия (например, как командлет Set-ExecutionPolicy), следует применять параметр Confirm.

Определение этих параметров в коде

Применение этих параметров в простых функциях (не advanced) по сути сводится к написанию собственных обработчиков этих параметров. В Advanced functions появилась возможность универсально обрабатывать эти параметры. Вот пример кода:

И вот вывод какое у нас получится поведение:

В данном случае предполагается, что функция выполняет деструктивные действия, поэтому по умолчанию мы выводим запрос о подтверждении операции по умолчанию. Если укажем WhatIf, мы увидим, что бы случилось при обычном запуске (с подтвеждением операции). Но если мы хотим выполнить операцию без всяких подтверждений, мы используем параметр Force.

Как мы добились такого поведения? Во-первых, конструкция в начале скрипта [CmdletBinding()] определяет общее поведение всего скрипта. У него есть разные атрибуты. В данном случае были использованы:

  • SupportsShouldProcess

Этот атрибут указывает, должен ли код ожидать ответ от пользователя на выполнение операции. Т.е. он включает обработчик для параметров –Confirm и –WhatIf.

Этот атрибут указывает уровень воздействия кода на систему и включает обработчик параметра –Confirm. Возможные значения:

  1. None (или атрибут не указан вообще) — никаких сообщений подтверждения операции выводиться не будет. Даже если вы явно укажете параметр Confirm.
  2. Low — код оказывает минимальное воздействие на систему с минимальным риском потери данных.
  3. Medium — код оказывает среднее воздействие с некоторым риском потерять данные или произвести деструктивные действия.
  4. High — выполняемый код обладает высоким риском потери данных. Например, уровень High выставлен у командлета Set-ExecutionPolicy.
Читайте также:  Amd athlon x4 950 тесты в играх

По умолчанию в сессии PowerShell уровень воздействия выставлен в High (можно посмотреть в переменной $ConfirmPreference). И все командлеты, у которых уровень воздействия на систему выше или такой же, как в $ConfirmPreference, запрос на подтверждение будет выводиться всегда.

Например, в сессии у нас $ConfirmPreference = ‘High’, а у командлета/функции тоже ‘High’ будет выведен запрос подтверждения. Как в случае с Set-ExecutionPolicy. Если у командлета/функции ConfirmImpact ниже (Low или Medium) запрос подтверждения по умолчанию выводиться не будет. Но возможно указать –Confirm для принудительного вывода запроса подтверждения. Если посмотреть на наш код, мы увидим, что уровень воздействия на систему высокий, поэтому мы каждый раз получаем запрос подтверждения. Если мы изменим уровень воздействия в уровень ‘Medium’, наша функция не будет по умолчанию выводить никаких запросов. Но будет выводить его при указании параметра –Confirm:

И вот какое у нас будет поведение:

Теперь запрос выводится только когда мы явно указываем параметр –Confirm. Параметры мы подключили, как реализовать код? Для этого есть специальная переменная $PsCmdlet, которая используется для обработки параметров командлета/функции. У этой переменной есть метод ShouldProcess("Target","Action description"). В аргумент Target указываете название объекта (в нашем случае — имя файла), над которым будет совершено действие, а в Action description пишите, какое действие будет произведено.

Указание параметра –WhatIf и/или –Confirm вызывает метод ShouldProcess и в зависимости от параметров выполняет нужное действие — выводит запрос или эмулирует выполнение команды. Поэтому мы просто засовываем $PSCmdlet.ShouldProcess() в условный оператор IF и в конструкции Then пишем код, который будет выполнять действие.

Чтобы реализовать функционал параметра –Force, я его поместил в то же условие. Причём, он должен проверяться первым. Это связано с тем, что при выполнении оператора –or, сначала проверяется выражение слева от оператора. Если оно возвращает True, выражение справа от оператора не проверяется. Следовательно, если параметр –Force указан, метод ShouldProcess() просто не вызовется.

При распитиинаписании скриптов, весьма целесообразно включать отладочную информацию в скрипт, которую можно посмотреть, если что-то идёт не так. Запомните, НИКАКИХ этих ваших Write-Host или чего-то ещё. Для этого предусмотрены параметры Verbose и Debug. Verbose применяется для вывода на экран общего хода выполнения скрипта. Debug применяется для включения уже детальной отладочной информации и возможно переключение в пошаговое исполнение скрипта. Эти параметры не надо определять в параметрах функции, они автоматически добавляются к коду при использовании конструкции [CmdletBinding()].

Вот как правильно определять поведение этих параметров:

Как мы уже знаем, если указана конструкция [CmdletBinding()], эти параметры автоматически подключаются к функции и мы их не определяем в секции param(). Чтобы отловить эти параметры, мы используем специальную переменную $PSBoundParameters. Более подробней об этой переменной я писал в статье: Cmdlet wrapping и PsBoundParameters. По умолчанию, $VerbosePreference и $DebugPreference = ‘SilentlyContinue’, т.е. даже при указании этих параметров вы ничего не увидите. Поэтому, если параметр указан при вызове функции, мы переводим их в состояние ‘Continue’, что включает вывод для Verbose и Debug.

Давайте посмотрим более реальный случай в несферическом вакууме — сброс пароля локального администратора:

И вот вывод в консоли для –Verbose:

Так же, мы видим, что Debug включает пошаговое исполнение скрипта, вне зависимоти от состояния параметра Force. Это только в случае, если у нас включен SupportsShouldProcess.

Ссылка на основную публикацию
Adblock detector