У меня есть следующая команда, чтобы проверить, существует ли папка с именем «AAA_*» в пути «C:\Test», и если да, то сделайте из нее переменную имени:
$DirPath = "C:\Test"
$DirName = "AAA"
If (Test-Path -Path ($DirPath + "\" + $DirName + "_*")) {
C:;cd\;cd ($DirPath + "\" + $DirName + "_*")
$NameFromDir = pwd | Select-Object | %{$_.ProviderPath.Split("\")[-1]}
cd $PSScriptRoot}
Мне нужно дважды написать путь, а также мне нужно зайти внутрь него, чтобы установить его как переменную.
Можно ли это сделать другим, более коротким или более простым способом?
Как имя папки могло содержать *
? Это недопустимый символ в Windows
@ mklement0 Эта команда очень короткая и удобная. Просто нужно немного изменить его, потому что .Name дает мне весь путь (например, C:\Test\AAA_BBB), а мне нужно было только имя (AAA_BBB). Итак, я наконец использовал: $NameFromDir = (Get-ChildItem C:\Test\AAA_*).Basename В любом случае - еще раз спасибо за вашу помощь! :)
Рад это слышать, @MikeZetPL, но учтите, что .Name
— это только имя файла или каталога, а не полный путь (только .FullName
); для каталогов .BaseName
совпадает с .Name
(для файлов это имя с удаленным расширением).
Попробуйте это ($NameFromDir будет пустым, если путь не существует):
$DirPath = "C:\Test"
$DirName = "AAA"
$NameFromDir = (Get-Item "$DirPath\$DirName_*").FullName
Если вам нужно ограничить результат одним элементом, вы можете добавить
| select-object -First 1
Также спасибо за вашу команду - это тоже рабочая версия, и FullName нужно изменить на Basename - тогда я получу только имя папки без полного пути: $NameFromDir = (Get-Item "$DirPath\$DirName_*").Basename
$NameFromDir = (Get-ChildItem C:\Test\AAA_*).Name
?