在PowerShell中,是否可以使用具有通配符的部分路径创建新文件目录(例如:C:\*\SomeFolder\MyBackup
)?如果是这样,怎么样?
我正在使用PowerShell创建一个应用程序,该应用程序的一部分让用户指定一个备份目录。这个目录可能是一个确切的路径,但我也期望可以使用通配符。话虽如此,我知道我可以轻松使用MD C:\SomePath\
或New-Item "C:\SomePath\" -FileType Directory
如果提供的路径是绝对的;但是,每当我尝试使用外卡时,它都会失败。
示例:这些都在我尝试时失败
MD "C:\*\MyBackups\AppBackup"
New-Item "C:\*\MyApp\Backup" -FileType Directory
$fullPath = "C:\*\MyApp\Backup" | Resolve-Path
$fullPath = Resolve-Path "C:\*\MyApp\Backup"
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("C:\*\MyApp\Backup")
现在,我理解失败的一部分是通配符本身,因为命令并不了解如何解释它。
我研究了New-Item
,Convert-Path
,Resolve-Path
和Split-Path
之类的内容,但我们找不到任何与我和我相关的内容。 #39;我试图这样做。
答案 0 :(得分:0)
md
,它是New-Item
周围的包装函数的别名,需要精确的路径。如果要基于通配符路径创建目录,则需要以下内容:
Get-ChildItem 'C:\*\MyBackups' | ForEach-Object {
New-Item -Type Directory -Path $_.FullName -Name 'MyBackup' | Out-Null
}
请注意,路径中的通配符通常只涵盖一个级别的层次结构。如果您想在C:驱动器上找到任何子文件夹MyBackups
,您需要这样的方法:
Get-ChildItem 'C:\' -Filter 'MyBackups' -Directory -Recurse | ForEach-Object {
New-Item -Type Directory -Path $_.FullName -Name 'MyBackup' | Out-Null
}
答案 1 :(得分:0)
如果您尝试接受用户输入并使其代表*,那么您需要在代码中表示。唯一令我困惑的地方是你有通配符。我不认为我完全理解通配符在脚本中的用途。
$backupTemplate = 'MyBackups\AppBackup'
#This can be a lot of different methods of input, from a Read-Host or what I have below
$dirSelector = New-Object System.Windows.Forms.FolderBrowserDialog -Property @{ SelectedPath = Get-Location }
$dirSelector.ShowDialog() | Out-Null
$dirSelector.SelectedPath
$bckupDir = "$($dirSelector.SelectedPath)\$backupTemplate"
#EDIT: You were indicating below you needed to find the parent directory for the 'anchor'. Added this here for that.
$parentDir = (Get-Item $dirSelector.SelectedPath).Parent.FullName
if(-not (Test-Path -Path $bckupDir))
{
New-Item -Path $bckupDir
}
#Execute your code here on whatever is doing the backup.
EDIT /增加:
如果您遇到的问题是用户设置了一次备份目录,然后可能不记得它在哪里,那么您应该考虑将此变量存储在用户可以在cmdlet和cmdlet中调用的位置可以使用。
一种非常常见的方法是创建一个文件,其中包含用户对您尝试完成的任何操作所做的设置。
一个很好的方法是创建一个标准对象,然后将其导出为CliXML(或JSON或您喜欢使用的任何格式),如下所示:
$userSettings = New-Object -TypeName psobject
$userSettings | Add-Member -MemberType NoteProperty -Name User -Value $env:USERNAME
$userSettings | Add-Member -MemberType NoteProperty -Name LastUpdate -Value $(Get-Date -format u)
$userSettings | Add-Member -MemberType NoteProperty -Name BackupDirectory -Value $dirSelector.SelectedPath
$userSettings | Export-Clixml -Path "$env:USERPROFILE\psUserProf.xml"
#when you need to get the users backup folder in the future you just import the profile and work from there
$userSettings = Import-Clixml -Path "$env:USERPROFILE\psUserProf.xml"
$userSettings.BackupDirectory
请注意,如果您的用户拥有多台计算机,则需要为这些设置提供便利。