Логика в сценарии - общая форма - имеет понятный смысл, но она не подходит для того, чтобы она работала так, как вы намеревались.
Тестирование на моем компьютере здесь:
new-item -ItemType File -Name 'test'
get-item test | format-list *
get-item test | foreach { $_.extension; $_.Extension.length; $_.extension.GetType().name }
файл без расширения отображается с пустой строкой (пустое содержимое, длина 0, введите String
, поэтому ваш where-object { $_.Extension -eq "." }
должен искать ""
вместо "."
.
Но:
Get-ChildItem | Where-Object { $_.Extension -eq '' }
также показывает некоторые папки, поскольку они не имеют расширения в названии, поэтому вы можете Get-ChildItem -File
ограничить его только файлами.
как мне указать данный каталог для поиска в этом скрипте, или мне даже нужно?
Он будет работать в текущем каталоге, в зависимости от того, что указано в вашем приглашении PS C:\wherever>
, поэтому, если вам нужно запустить его где-то еще, да, вам нужно перейти в эту папку или указать в get-childitem -LiteralPath 'c:\path\to\wherever'
. Вы не упомянули подпапки, если они вам нужны, переключитесь на get-childitem -Recurse
.
Говоря о подпапках, ваш $filenew = $file.Name + ".pdf"
имеет смысл только в текущем каталоге, я думаю, что он будет работать лучше, если вы используете полное имя файла, включая путь, поэтому они определенно будут переименованы в том же месте, где были найдены $filenew = $file.FullName + ".pdf"
Является ли "Extension -eq "."
правильным синтаксисом для указания имени файла без расширения?
Будьте осторожны, то, что вы написали в своем вопросе, было правильным синтаксис , но неверное содержимое строки. То, что вы написали здесь с кавычками слева от Расширения, является неправильным синтаксисом.
Другой моей мыслью было использование Extension -eq "null" или чего-то подобного. Если мне нужно будет использовать нулевое значение, как это будет выглядеть?
И будьте осторожны, "null"
- это не нулевое значение, это строка, содержащая четырехбуквенное слово «ноль».
Вам не нужно здесь использовать нулевое значение, обычно, если вы делаете, это выглядит как $null
, но в этом случае вы можете использовать where-object { [string]::IsNullOrEmpty($_.Extension) }
, но я думаю, что это не принесет никакой пользы.
И, как стилистический выбор, ""
и ''
являются строками, но ""
может содержать переменные и подвыражения, поэтому, если у вас есть простой текст, это хорошая привычка использовать для него ''
потому что это дает читателю понять, что вы намерены, чтобы в этой строке ничего особенного не происходило.
Тогда ваш код с заданными именами параметров будет выглядеть примерно так:
$proj_files = Get-ChildItem -LiteralPath 'C:\Users\mthomas\Documents' |
Where-Object {$_.Extension -eq '.'}
foreach ($file in $proj_files)
{
$filenew = $file.FullName + '.pdf'
Rename-Item -LiteralPath $file.FullName -NewName $filenew
}
Если вы хотите увидеть, что он будет делать, используйте -WhatIf
в конце Rename-Item
:
Rename-Item -LiteralPath $file.FullName -NewName $filenew -WhatIf
Тогда он не будет вносить изменения, просто скажу вам, что он будет делать.
Я не решаюсь проверить это, прежде чем получить второе мнение, потому что я не хочу менять каждое расширение файла на моем компьютере или что-то глупое, как это
Разумный. Но интернет-пользователи скажут вам протестировать их код перед его запуском, потому что в конечном счете вы несете ответственность за защиту своих файлов, а не за доверие случайного кода из Интернета, поэтому наличие тестовых папок, наличие запасной машины, хорошее резервное копирование, играть с PowerShell по частям до тех пор, пока вы не будете довольны тем, что они делают, у них тоже есть хорошие привычки.