使用部分路径创建目录

时间:2017-08-16 15:48:13

标签: powershell wildcard filepath create-directory

问题

在PowerShell中,是否可以使用具有通配符的部分路径创建新文件目录(例如:C:\*\SomeFolder\MyBackup)?如果是这样,怎么样?

详细信息

我正在使用PowerShell创建一个应用程序,该应用程序的一部分让用户指定一个备份目录。这个目录可能是一个确切的路径,但我也期望可以使用通配符。话虽如此,我知道我可以轻松使用MD C:\SomePath\New-Item "C:\SomePath\" -FileType Directory如果提供的路径是绝对的;但是,每当我尝试使用外卡时,它都会失败。

示例:这些都在我尝试时失败

  1. MD "C:\*\MyBackups\AppBackup"
  2. New-Item "C:\*\MyApp\Backup" -FileType Directory
  3. $fullPath = "C:\*\MyApp\Backup" | Resolve-Path
  4. $fullPath = Resolve-Path "C:\*\MyApp\Backup"
  5. $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("C:\*\MyApp\Backup")
  6. 现在,我理解失败的一部分是通配符本身,因为命令并不了解如何解释它。

    我研究了New-ItemConvert-PathResolve-PathSplit-Path之类的内容,但我们找不到任何与我和我相关的内容。 #39;我试图这样做。

2 个答案:

答案 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

请注意,如果您的用户拥有多台计算机,则需要为这些设置提供便利。