Как удалить все файлы внутри подпапок, но не сами подпапки?

Notes

  • The split location parameters (Qualifier, Parent, Extension, Leaf, LeafBase,
    and NoQualifier) are exclusive. You can use only one in each command.

  • The cmdlets that contain the Path noun (the Path cmdlets) work with path names and return
    the names in a concise format that all PowerShell providers can interpret. They are designed for
    use in programs and scripts where you want to display all or part of a path name in a particular
    format. Use them in the way that you would use Dirname, Normpath, Realpath, Join,
    or other path manipulators.

  • You can use the Path cmdlets together with several providers. These include the FileSystem,
    Registry, and Certificate providers.

  • is designed to work with the data exposed by any provider. To list the providers
    available in your session, type . For more information, see about_Providers.

Получение данных

Для открытия файла ‘C:\text.txt’ можно использовать следующую команду:

Get-Content -Path ‘C:\Windows\System32\drivers\etc\hosts’

1 Get-Content-Path’C:\Windows\System32\drivers\etc\hosts’

Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:

  • ‘*’ — говорит об неизвестном количестве символов;
  • — говорит, что в этом месте может быть буква ‘a’ или ‘b’;
  • ? — обозначает один неизвестный символ.

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

В этом примере я открою сразу два файла: lmhosts и hosts:

Get-Content -Path ‘C:\Windows\System32\drivers\etc\*st*’

1 Get-Content-Path’C:\Windows\System32\drivers\etc\*st*’

Следующие примеры вернут аналогичный результат:

Get-Content -Path ‘C:\Windows\System32\drivers\etc\*ost*’
Get-Content -Path ‘C:\Windows\System32\drivers\etc\*h?st*’

1
2

Get-Content-Path’C:\Windows\System32\drivers\etc\*ost*’

Get-Content-Path’C:\Windows\System32\drivers\etc\*h?st*’

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

  • Include — в этом параметре мы добавляем шаблон, по которому будем включать файл;
  • Exclude — с помощью этого параметра исключает файлы;
  • Filter — исключает результаты.

Для каждого из этих параметров есть обязательно условие — использовать знак ‘*’ в конце пути.

Так мы вернем все файлы с расширением ‘.txt’:

Get-Content -Path ‘C:\*’ -Filter ‘*.txt’

1 Get-Content-Path’C:\*’-Filter’*.txt’

В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата ‘.txt’ и ‘.ini’:

Get-Content -Path ‘C:\*’ -Include ‘*.txt’,’*.ini’

1 Get-Content-Path’C:\*’-Include’*.txt’,’*.ini’

Полное и построчное чтение с поиском

По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:

Get-Content -Path ‘C:\file*.txt’ | Select-String -Pattern ‘Line 8’

1 Get-Content-Path’C:\file*.txt’|Select-String-Pattern’Line 8′

Что бы текст передавался полностью, а не построчно — используйте параметр Raw:

Get-Content -Path ‘C:\file*.txt’ -Raw | Select-String -Pattern ‘Line 8’

1 Get-Content-Path’C:\file*.txt’-Raw|Select-String-Pattern’Line 8′

Если вам вдруг понадобится выводить по 2 или более строк за раз, можно указать их количество через ReadCount:

Get-Content -Path ‘C:\file*.txt’ -ReadCount 2 | Select-String -Pattern ‘Line 8’

1 Get-Content-Path’C:\file*.txt’-ReadCount2|Select-String-Pattern’Line 8′

Разделение файла

Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен ‘\n’ (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:

Get-Content -Path ‘C:\delimiter.txt’ -Delimiter ‘;’

1 Get-Content-Path’C:\delimiter.txt’-Delimiter’;’

То есть результат выше — это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:

$content = Get-Content -Path ‘C:\delimiter.txt’ -Delimiter ‘;’
# Выведем первый элемент
$content
# Уберем разделитель во всех адресах
foreach ($c in $content){
$c -replace ‘;’,»
}

1
2
3
4
5
6
7

$content=Get-Content-Path’C:\delimiter.txt’-Delimiter’;’

# Выведем первый элемент

$content

# Уберем разделитель во всех адресах

foreach($cin$content){

$c-replace’;’,»

}

Подсчет количества строк

Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:

Get-Content -Path ‘C:\file.txt’ | measure

1 Get-Content-Path’C:\file.txt’|measure

Если нужна только цифра, а не объект, можно сделать так:

(Get-Content -Path ‘C:\file.txt’ | measure).Count

1 (Get-Content-Path’C:\file.txt’|measure).Count

Кодировки

В параметре -Encoding можно указать следующие кодировки:

  • ASCII
  • BigEndianUnicode
  • BigEndianUTF32
  • Byte
  • Default
  • OEM
  • Unicode
  • UTF7
  • UTF8
  • UTF32

Чтения файла под другим пользователем

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

  • Access to the path is denied
  • The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again withoutspecifying credentials.

Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.

Сам процесс открытия файла под другим пользователем будет выглядеть так:

# Вводим свои учетные данные
$creds = Get-Credential
# Выполняем запрос под другим пользователем
Invoke-Command -Computer localhost -Credential $creds -ScriptBlock {Get-Content -Path ‘C:\Folder\File2.txt’}

1
2
3
4

# Вводим свои учетные данные

$creds=Get-Credential

# Выполняем запрос под другим пользователем

Invoke-Command-Computerlocalhost-Credential$creds-ScriptBlock{Get-Content-Path’C:\Folder\File2.txt’}

Examples

Example 1: Get the current directory

This example gets the current directory. The dot (‘.’) represents the item at the current location
(not its contents).

Example 2: Get all the items in the current directory

This example gets all the items in the current directory. The wildcard character () represents
all the contents of the current item.

Example 3: Get the current directory of a drive

This example gets the current directory of the drive. The object that is retrieved represents
only the directory, not its contents.

Example 4: Get items in the specified drive

This example gets the items in the drive. The wildcard character () represents all the items
in the container, not just the container.

In PowerShell, use a single asterisk () to get contents, instead of the traditional . The
format is interpreted literally, so wouldn’t retrieve directories or filenames without a dot.

Example 5: Get a property in the specified directory

This example gets the LastAccessTime property of the directory. LastAccessTime
is just one property of file system directories. To see all the properties of a directory, type
.

Example 6: Show the contents of a registry key

This example shows the contents of the Microsoft.PowerShell registry key. You can use this
cmdlet with the PowerShell Registry provider to get registry keys and subkeys, but you must use the
cmdlet to get the registry values and data.

Example 7: Get items in a directory that have an exclusion

This example gets items in the Windows directory with names that include a dot (), but don’t
begin with .This example works only when the path includes a wildcard character () to specify
the contents of the item.

Example 8: Getting hardlink information

In PowerShell 6.2, an alternate view was added to get hardlink information. To get the hardlink
information, pipe the output to

The property identifies the hardlink by the in

Example 9: Output for Non-Windows Operating Systems

In PowerShell 7.1 on Unix systems, the cmdlet provides Unix-like
output:

The new properties that are now part of the output are:

  • UnixMode is the file permissions as represented on a Unix system
  • User is the file owner
  • Group is the group owner
  • Size is the size of the file or directory as represented on a Unix system

Note

This feature was moved from experimental to mainstream in PowerShell 7.1.

Пример 1. Предоставление права доступа к папке определенной локальной группе безопасности только на чтение.

Данная ситуация очень распространена. Предположим у вас есть локальная папка, содержимым которой вы хотите поделиться с определенным количеством пользователей. Причем доступ к данной папке перечисленным пользователям должен быть только на чтение. Как это сделать?

Сначала создадим локальную группу, в которую включим весь список нужных нам пользователей. Можно и без группы, но тогда для каждого пользователя нужно будет настраивать права отдельно, и каждый раз, когда понадобится дать права новому человеку, потребуется проделывать все операции заново. А если права предоставить локальной группе, то для настройки нового человека понадобится только одно действие – включение этого человека в локальную группу. Как создать локальную группу безопасности читаем в статье «Настройка локальных групп безопасности».

Итак. Мы создали локальную группу безопасности с именем «Коллегам для чтения»,
в которую добавили всех нужных пользователей.

Теперь настраиваю права доступа к папке. В данном примере я сделаю права доступа созданной группе «Коллегам для чтения» на папку «Фото».

Нажимаю правой клавишей мышки на папку «ФОТО» и выбираю пункт меню «Свойства», перехожу на закладку «Безопасность».

В открывшейся закладке «Безопасность» отображаются текущие права папки «ФОТО». Выделив группы и пользователей в списке, можно увидеть, что права этой папки наследуются от родительской папки(серые галочки в столбце «Разрешить»). В данной ситуации я не хочу, чтобы кто-то кроме вновь созданной группы имел хоть какой-то доступ к папке «ФОТО».

Поэтому, я должен убрать наследование прав и удалить ненужных пользователей и группы из списка. Нажимаю кнопку «Дополнительно». В открывшемся окне,
убираю галочку с пункта «Наследовать от родительского объекта применимые к дочерним объектам разрешения, добавляя их к явно заданным в этом окне.». При этом откроется окно, в котором я смогу выбрать, что делать с текущими унаследованными правами.
В большинстве случаев я советую нажимать здесь кнопку «Копировать», так как если выбрать «Удалить», то список прав становится пуст, и вы можете фактически забрать права у самого себя. Да, не удивляйтесь, это очень легко сделать. И если вы не администратор на своем компьютере, или не пользователь группы «Операторы архива», то восстановить права вам будет невозможно. Ситуация напоминает дверь с автоматической защелкой, которую вы закрываете, оставляя ключи внутри. Поэтому, лучше всегда нажимайте кнопку «Копировать», а потом удаляйте ненужное.

После того, как я нажал «Копировать», я опять возвращаюсь в предыдущее окно, только уже со снятой галочкой.

Нажимаю «ОК» и возвращаюсь в окно базовых прав. Все права стали доступны для редактирования. Мне нужно оставить права для локальной группы «Администраторы» и пользователя SYSTEM, а остальных удалить. Я поочередно выделяю ненужных пользователей и группы и нажимаю кнопку «Удалить».

В результате у меня получается вот такая картина.

Теперь мне остается добавить только группу «Коллегам для чтения» и назначить этой группе права на чтение.

Я нажимаю кнопку «Добавить», и в стандартном окне выбора выбираю локальную группу «Коллегам для чтения». Как работать с окном выбора подробно описано в статье «Настройка локальных групп безопасности».

В результате всех действий, я добавил группу «Коллегам для чтения» в список базовых прав, при этом для этой группы автоматически установились права «Чтение и выполнение», «Список содержимого папки», «Чтение».

Все, остается нажать кнопку «ОК» и права назначены. Теперь любой пользователь, который принадлежит локальной группе безопасности «Коллегам для чтения», получит возможность читать все содержимое папки «ФОТО».

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

Извлечь все элементы непосредственно из папки можно с помощью командлета . Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):

Get-ChildItem -Path C:\ -Force

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда  оболочки  или команда  оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр . (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:

Get-ChildItem -Path C:\ -Force -Recurse

Командлет  позволяет отфильтровать элементы с помощью параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью .

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г. и размер которых не менее одного мегабайта и не более десяти мегабайт:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)}

Просмотр действующих прав.

Хочу сказать сразу, имеющаяся возможность просмотреть действующие права для папки или файла, является полной фикцией. В моем представлении такие инструменты должны давать гарантированную информацию. В данном случае это не так. Майкрософт сама признается в том, что данный инструмент не учитывает много факторов, влияющих на результирующие права, например, условия входа. Поэтому, пользоваться подобным инструментом – только вводить себя в заблуждение относительно реальных прав.

Описанный в самом начале статьи случай, с запретом на удаление файла из папки в данном случае является очень красноречивым. Если вы смоделируете подобную ситуацию и посмотрите на права файла, защищенного от удаления, то вы увидите, что в правах файла на удаление стоит запрет. Однако, удалить этот файл не составит труда. Почему Майкрософт так сделала — я не знаю.

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

Затем необходимо нажать кнопку «Выбрать» и в стандартном окне выбора выбрать нужного пользователя или группу.

После выбора можно увидеть «приблизительные» действующие разрешения.

Если есть желание поддержать автора «чашкой кофе» можно перевести вот сюда:

Счет в формате IBAN: BY05ALFA30147131190010270000Реквизиты банка на русском языке:Наименование: ЗАО «АЛЬФА-БАНК»Юридический адрес: г. Минск, ул. Сурганова, 43-47 , 220013, Республика Беларусь
СВИФТ: ALFABY2X
БИК / МФО: ALFABY2X
УНП: 101541947 ОКПО 37526626

Bank details:
Name: CLOSED JOINT-STOCK COMPANY «ALFA-BANK»
Address: 43-47, Surganova St., Minsk, 220013 Republic of Belarus
SWIFT: ALFABY2X BIC / MFO — ALFABY2X UNP — 101541947

Создание файлов и папок

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

Эта команда создает папку :

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Эта команда создает пустой файл .

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Важно!

При использовании параметра Force с командой  для создания папки, которая уже существует, она не перезапишет и не заменит папку. Будет просто возвращен имеющийся объект папки. Однако, если использовать  в уже имеющимся файле, файл будет полностью перезаписан.

3 ответа

Лучший ответ

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

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

2

AdminOfThings
23 Сен 2020 в 05:10

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

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

Причина в том, что не может принимать массив в качестве параметра (и мы знаем, что массив, выполняя ).

Следовательно, вам нужно сначала перебрать элементы массива, используя или один из его псевдонимов: или .

1

eduherminio
23 Сен 2020 в 00:26

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

В этом отношении правильное короткое обозначение конвейера будет следующим:

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

Соответствующие страницы и примеры PS7:

  • : https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-host?view=powershell-7
  • : https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7
  • Переменные: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-7

1

muratiakos
23 Сен 2020 в 00:16

Удаление всех файлов и папок, содержащихся в папке

Удалить вложенные элементы можно с помощью командлета , однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки , которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:

Remove-Item -Path C:\temp\DeleteMe

Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter was not
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
 Yes   Yes to All   No   No to All   Suspend   Help
(default is "Y"):

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Изменение файла с последующей записью

Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес ‘127.0.0.1’ в строке — это можно сделать так:

‘My address: 127.0.0.1/24’ -replace ‘127.0.0.1’,’192.168.3.2′

1 ‘My address: 127.0.0.1/24′-replace’127.0.0.1′,’192.168.3.2’

Или с помощью регулярного выражения (не точный шаблон):

‘My address: 127.0.0.1/24’ -replace ‘\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’,’192.168.3.2′

1 ‘My address: 127.0.0.1/24′-replace’\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’,’192.168.3.2′

Для записи в файл у нас есть два варианта. Первый — это использовать перенаправление в виде знака ‘>’, который перезапишет все содержимое файла или создаст новый файл:

$file_content = Get-Content -Path ‘C:\file1.txt’
$file_content -replace ‘127.0.0.1’,’192.168.3.2′ > file1.txt

1
2

$file_content=Get-Content-Path’C:\file1.txt’

$file_content-replace’127.0.0.1′,’192.168.3.2′>file1.txt

Второй вариант — использовать команду Set-Content:

$file_content = Get-Content -Path ‘C:\file1.txt’
$file_content -replace ‘127.0.0.1’,’192.168.3.2′ | Set-Content -Path ‘C:\file1.txt’

1
2

$file_content=Get-Content-Path’C:\file1.txt’

$file_content-replace’127.0.0.1′,’192.168.3.2’|Set-Content-Path’C:\file1.txt’

Подсчет четных чисел в файле

У меня есть файл ‘file.txt’ со следующим содержанием:

some text 123 some text 6 some
text 9 some text 312345
123.2

1
2
3

some text123some text6some

text9some text312345

123.2

Шаблон регулярного выражения  ‘\d*\.?\d*’ говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой. 

Для выделения таких чисел из строк нужно использовать Select-String:

$file = Get-Content -Path ‘file.txt’
$result = Select-String -InputObject $file -Pattern ‘\d*\.?\d*’ -AllMatches | Foreach {$_.matches}

1
2

$file=Get-Content-Path’file.txt’

$result=Select-String-InputObject$file-Pattern’\d*\.?\d*’-AllMatches|Foreach{$_.matches}

Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:

$result | where Value -ne » | select Value

1 $result|where Value-ne»|select Value

Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:

# Открываем файл
$opened_file = Get-Content -Path ‘file.txt’
# Поиск чисел
$result = Select-String -InputObject $opened_file -Pattern ‘\d*\.?\d*’ -AllMatches | Foreach {$_.matches}
# Исключение пустых строк в выводе
$result = ($result | where Value -ne »).Value
foreach ($num in $result){
# Результат деления
$n = $num%2
if ($n -eq 0){Write-Output «Число четное: $num»}
else {Write-Output «Число не четное: $num»}
}

1
2
3
4
5
6
7
8
9
10
11
12

# Открываем файл

$opened_file=Get-Content-Path’file.txt’

# Поиск чисел

$result=Select-String-InputObject$opened_file-Pattern’\d*\.?\d*’-AllMatches|Foreach{$_.matches}

# Исключение пустых строк в выводе

$result=($result|where Value-ne»).Value

foreach($num in$result){

# Результат деления

$n=$num%2

if($n-eq){Write-Output»Число четное: $num»}

else{Write-Output»Число не четное: $num»}

}

Копирование файлов и папок

Копирование выполняется с помощью командлета . Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak

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

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force

Эта команда работает, даже если целевой объект доступен только для чтения.

Так же выполняется и копирование папок. Эта команда копирует папку  в новую папку  рекурсивно.

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Можно также скопировать избранные элементы. Следующая команда копирует все файлы TXT, содержащиеся в папке , в папку :

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла  в файле :

(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')

Examples

Example 2: Display file names

This command displays the files that are referenced by the split path. Because this path is split to
the last item, also known as the leaf, the command displays only the file names.

The Resolve parameter tells to display the items that the split path references,
instead of displaying the split path.

Like all commands, this command returns strings. It does not return FileInfo
objects that represent the files.

Example 3: Get the parent container

This command returns only the parent containers of the path. Because it does not include any
parameters to specify the split, uses the split location default, which is Parent.

Example 4: Determines whether a path is absolute

This command determines whether the path is relative or absolute. In this case, because the path is
relative to the current folder, which is represented by a dot (), it returns .

Example 5: Change location to a specified path

This command changes your location to the folder that contains the PowerShell profile.

The command in parentheses uses to return only the parent of the path stored in the
built-in variable. The Parent parameter is the default split location parameter.
Therefore, you can omit it from the command. The parentheses direct PowerShell to run the command
first. This is a useful way to move to a folder that has a long path name.

Example 6: Split a path by using the pipeline

This command uses a pipeline operator () to send a path to . The path is enclosed in
quotation marks to indicate that it is a single token.

3 ответа

Лучший ответ

Вот как я бы это сделал:

Базовый код взят из моего ответа на вопрос Удаление содержимого папки, но не папки, а с замененной командой с помощью второго цикла , который просматривает все файлы и удаляет только те, которые не имеют имени .

Обратите внимание, что этот подход не затрагивает исходный родительский каталог и не касается исходного файла. Большим преимуществом этого факта является то, что никакие атрибуты не будут потеряны (например, дата создания и владелец)

Объяснение

  • перейти в корневой каталог с помощью ; в случае неудачи пропустить оставшуюся часть скрипта;
  • перебрать все непосредственные подпапки корня с помощью цикла и рекурсивно удалить их с помощью со всем их содержимым;
  • перебирать файлы, расположенные в корне, стандартным циклом ; используйте модификатор переменной цикла, чтобы развернуть базовое имя () и расширение () каждого файла, сравните его с заданным именем файла () без учета регистра () и удалить файл с помощью только в том случае, если он не совпадает ();
  • окончательно восстановить прежний рабочий каталог ;

Основные проблемы в вашем коде:

  • что вы сравниваете больше, чем чистое имя файла с предварительно заданным именем, поэтому совпадения не будет.
  • вам нужно было использовать сравнение без учета регистра, потому что Windows не заботится о регистре имен файлов для поиска.
  • вы не заключили в кавычки выражения сравнения, поэтому вы, вероятно, получите сообщения об ошибках синтаксиса, в зависимости от того, какие специальные символы встречаются в именах файлов.
  • что вы используете только команду , которая просто удаляет файлы; чтобы удалить каталоги, вам также нужно было использовать .

3

Community
23 Май 2017 в 12:00

Я не уверен, где хранится файл web.config или их больше одного, поэтому …

Только один файл

Просто заблокируйте файл (перенаправьте файл как входной) и удалите все остальное.

Код будет

  1. () Перейдите в целевую папку (мы должны быть уверены, что это удалит информацию только из предполагаемого места), установив ее в качестве текущего активного каталога и заблокировав его (мы не можем удалить текущий активный каталог). Если команда может перейти в папку, тогда

  2. () Перенаправьте в качестве входных данных для команды . Это заблокирует файл, поэтому его нельзя будет удалить до завершения команды. удаляет все, что не заблокировано внутри (и ниже) текущего активного каталога

  3. () Отменить команду , восстанавливающую предыдущий активный каталог

Несколько файлов в нескольких папках

Следуя подходу (копировать, очищать, восстанавливать) указано @Dominique

Код будет

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

  2. () Подготовьте ссылку (случайное имя) на временную папку для использования

  3. () Скопируйте только файлы (и их иерархию папок) из исходной папки во временную папку

  4. () Отразите временную папку в исходной папке. Это удалит все файлы / папки, не включенные во временную копию.

  5. () Удалите временную папку

  6. () Отменить команду , восстанавливающую предыдущий активный каталог

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

1

MC ND
26 Авг 2016 в 11:58

Мне тоже удалось это сделать, очень похоже на @aschipfl

Viki2016
26 Авг 2016 в 13:21

Parameters

-Credential

Note

This parameter isn’t supported by any providers installed with PowerShell.
To impersonate another user, or elevate your credentials when running this cmdlet,
use Invoke-Command.

Type: PSCredential
Position: Named
Default value: Current user
Accept pipeline input: True
Accept wildcard characters: False

-Exclude

Specifies, as a string array, an item or items that this cmdlet excludes in the operation. The value
of this parameter qualifies the Path parameter. Enter a path element or pattern, such as
. Wildcard characters are permitted. The Exclude parameter is effective only when the
command includes the contents of an item, such as , where the wildcard character
specifies the contents of the directory.

Type: String
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: True

-Filter

Specifies a filter to qualify the Path parameter. The FileSystem
provider is the only installed PowerShell provider that supports filters. Filters are more efficient
than other parameters. The provider applies filter when the cmdlet gets the objects rather than
having PowerShell filter the objects after they’re retrieved. The filter string is passed to the
.NET API to enumerate files. The API only supports and wildcards.

Type: String
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: True

-Force

Indicates that this cmdlet gets items that can’t otherwise be accessed, such as hidden items.
Implementation varies from provider to provider. For more information, see
about_Providers. Even using the Force
parameter, the cmdlet can’t override security restrictions.

Type: SwitchParameter
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False

-Include

Specifies, as a string array, an item or items that this cmdlet includes in the operation. The value
of this parameter qualifies the Path parameter. Enter a path element or pattern, such as
. Wildcard characters are permitted. The Include parameter is effective only when the
command includes the contents of an item, such as , where the wildcard character
specifies the contents of the directory.

Type: String
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: True

-LiteralPath

Specifies a path to one or more locations. The value of LiteralPath is used exactly as it’s
typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose
it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters
as escape sequences.

For more information, see about_Quoting_Rules.

Type: String
Aliases: PSPath, LP
Position: Named
Default value: None
Accept pipeline input: True
Accept wildcard characters: False

-Path

Specifies the path to an item. This cmdlet gets the item at the specified location. Wildcard
characters are permitted. This parameter is required, but the parameter name Path is optional.

Use a dot () to specify the current location. Use the wildcard character () to specify all the
items in the current location.

Type: String
Position:
Default value: None
Accept pipeline input: True
Accept wildcard characters: True

-Stream

Note

This Parameter is only available on Windows.

Gets the specified alternate NTFS file stream from the file. Enter the stream name. Wildcards are
supported. To get all streams, use an asterisk (). This parameter isn’t valid on folders.

Stream is a dynamic parameter that the FileSystem provider adds to the cmdlet.
This parameter works only in file system drives.

Type: String
Position: Named
Default value: No alternate file streams
Accept pipeline input: False
Accept wildcard characters: True

Как удалить файлы в Microsoft Windows

Пользователи Microsoft Windows могут удалить файл или папку (каталог) разными способами. Ниже приведены наиболее распространенные способы удаления файла или папки.

Пользователи, не знакомые с Windows, должны понимать, что если вы удаляете папку, она удаляет все файлы и папки в этой папке.

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

Удалить файл или папку

Найдите элемент, который вы хотите удалить, выделите его, нажав один раз на файл или папку, и нажмите клавишу удаления на клавиатуре. Вы можете найти местоположение файла или папки, используя Мой компьютер или Проводник Windows.

Вы можете удалить несколько файлов или папок, удерживая клавишу Ctrl и щелкая каждый из них перед нажатием «Удалить».

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

Удалить файл или папку, щелкнув правой кнопкой мыши

Откройте Мой компьютер или Проводник Windows. Найдите файл или папку, которую вы хотите удалить, и щелкните по ней правой кнопкой мыши. Выберите опцию удаления из всплывающего меню.

Удалить из меню файла

Откройте Мой компьютер или Проводник Windows, найдите и выберите файл или папку, которую вы хотите удалить, нажмите файл в верхней строке меню и выберите удалять,

Если файл меню не отображается в «Моем компьютере» или в проводнике Windows, нажмите клавишу «Alt», чтобы отобразить строку меню, включая меню «Файл».

Проблемы при удалении

Некоторые файлы и папки могут быть защищены от удаления с помощью шифрования или парольной защиты. В этом случае вас могут попросить ввести пароль для расшифровки или снятия защиты паролем.

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

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

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

Как восстановить удаленный файл или папку

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: