#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. Не беспокойтесь — моя ошибка, перечитывая тему выше, это довольно очевидно! Похоже, Бендер тебя накрыл 😉