Как рекурсивно игнорировать файлы в Dropbox с помощью Powershell

#powershell #dropbox

Вопрос:

Я разработчик узлов и хочу, чтобы вся моя работа сохранялась в Dropbox, за исключением больших каталогов «node_modules». Я нашел код Powershell, который выборочно игнорирует папку, существующую в Dropbox в https://help.dropbox.com/files-folders/restore-delete/ignored-files:

 Set-Content -Path 'C:UsersyournameDropbox(Personal)YourFileName.pdf' -Stream com.dropbox.ignored -Value 1
 

Я хочу создать сценарий Powershell, который поможет мне найти все каталоги «node_modules» в Dropbox, а затем игнорировать их. Мне действительно нужна ваша помощь, потому что я действительно мало что знаю о Powershell.

В поисках Интенета я написал этот небольшой фрагмент кода, чтобы рекурсивно найти все каталоги «node_modules» в папке Dropbox.

 $BaseDir = "C:UsersgiannDropboxIdeaProjects"
$NameToFind = "node_modules"
$MyVariable = Get-ChildItem $BaseDir -Recurse | Where-Object { $_.PSIsContainer -and $_.Name.EndsWith($NameToFind)}
 

Мой вопрос в том, как я могу объединить два фрагмента кода? Не могли бы вы, пожалуйста, указать мне правильное направление?

Спасибо, я очень ценю вашу поддержку.

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

1. Просто для подтверждения, вы пытаетесь рекурсивно удалить содержимое (файлы) для всех node_modules папок в целевом каталоге? Я спрашиваю, потому Clear-Content что удалю содержимое файла, но оставлю файл там. То, что вы, вероятно, ищете здесь, — это Remove-Item команда.

2. «Я нашел код Powershell, который выборочно игнорирует папку, существующую в Dropbox» — вы уверены? Похоже, это уберет флаг игнорирования…

3. Clear-Content вероятно, это очистка содержимого, а также установка флага потока для содержимого. ОП хочет Set-Content вместо Clear-Content с теми же параметрами.

4. Боже мой, я скопировал не тот снипет. Теперь этот вопрос обновлен.

5. Я допустил ошибку, написав неправильный код. Спасибо @Mathias R. Jessen.

Ответ №1:

Примечание: Set-Content требуется -Value параметр. Если вы просто хотите настроить поток без изменения содержимого, используйте -Value $null . Это не приведет к удалению содержимого вашего файла.

Вы почти на месте, вам просто нужно использовать результат вашей Get-ChildItem команды во втором блоке. Вы также можете использовать -Directory параметр вкл Get-ChildItem для перечисления только каталогов, а не файлов:

 $BaseDir = "C:UsersgiannDropboxIdeaProjects"
$NameToFind = "node_modules"

# Changed variable name for clarity, multiline for readability
$FoundFiles = Get-ChildItem $BaseDir -Directory -Recurse | Where-Object {
  $_.Name.EndsWith($NameToFind)
}

foreach($file in $FoundFiles) { Set-Content -Path $file -Stream com.dropbox.ignored -Value $null }
 

Примечание: foreach может использоваться вместо ForEach-Object приведенного ниже, но имейте в виду foreach , что используемый вне конвейера оператор и функционирует иначе, чем foreach => ForeEach-Object псевдоним командлета, используемый внутри конвейера. Прочитайте эту статью для получения дополнительной информации о различиях между foreach инструкцией и ForEach-Object командлетом.

Если вы не хотите использовать $FoundFiles позже, вы можете объединить последние два выражения следующим образом:

 Get-ChildItem $BaseDir -Directory -Recurse | Where-Object {
  $_.Name.EndsWith($NameToFind)
} | ForEach-Object { Set-Content -Path $_ -Stream com.dropbox.ignored -Value $null }
 

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

 xattr -w com.dropbox.ignored 1 "$filePath"
 

Я не уверен, будут ли Set-Content установлены атрибуты файлов в Linux, как xattr это делается, но выше is how Dropbox recommends doing it .

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

1. Большое вам спасибо @Bender the Greatest, это именно то, что я искал. Для меня важно игнорировать эти каталоги, потому что Dropbox застревает, пытаясь синхронизировать эти гигантские каталоги, и по замыслу у каждого проекта узла есть один. Мое не очень элегантное решение состояло в том, чтобы приостановить Dropbox и остановить синхронизацию, упустив весь смысл наличия Dropbox. Хорошего вам дня и еще раз спасибо за вашу помощь.

2. @GianniFontanot Нет проблем. Я обновил ответ, чтобы удалить информацию о Clear-Content том, как вы обновили вопрос правильным примером.

Ответ №2:

Если я понимаю, что вы пытаетесь сделать, а именно удалить все node_modules каталоги рекурсивно, это должно сделать это;

 $RootDirectory = "C:TMP"
$FolderNameToRemove = "node_modules"
$Folders = Get-ChildItem $RootDirectory -Recurse | Where-Object { ($_.PSIsContainer) -and ($_.Name -eq $FolderNameToRemove) }
$Folders | % {
    Write-Host "Removing [$($_.FullName)]..."
    #Remove-Item $_.FullName -Recurse
    #Set-Content -Path $_.FullName -Stream com.dropbox.ignored -Value 1
}
 

Используйте на свой страх и риск, так как это приведет к удалению файлов.

В качестве альтернативы замените Remove-Item команду Set-Content командой, которую вы опубликовали выше.

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

1. Спасибо за ваш ответ @elkenyo, но нет, я не хочу рекурсивно удалять каталоги.

2. Не беспокойтесь — моя ошибка, перечитывая тему выше, это довольно очевидно! Похоже, Бендер тебя накрыл 😉