在Powershell中声明完整路径的最佳方法是什么?我正在编写一个需要通过多个psm1文件传递完整文件路径变量(例如:$ Backup = C:\ backups \ file1.bak)并远程调用的模块。
现在,我需要将一个完全限定的路径传递给Powershell并让它做很多不同的事情。当它全部在1个函数脚本中时似乎工作正常,否则,该路径实际上不会通过其他PSM1文件中编写的其他函数,但所有其他变量都可以。它似乎只输出一个空值。
首先,我有一个FileValidator脚本,除其他外,它将在路径中找到最新的文件名,然后使用路径连接最新的文件名。也许我需要在某处使用joinpath来解决这个问题。获取未导出到其他PSM1文件的完全限定路径的代码是:
Param: [string] $BackupPath, #= "Z:\backupsfldr\subfldr\"
$LatestSQLBackupDBFileName = Get-ChildItem $BackupPath | Where-Object{($_.LastWriteTime -gt "2014/02/01") -and ($_.Name -like "$DBname*.bak")} | Sort-Object LastWriteTime -Descending | Select-Object -First 1 | select -ExpandProperty name
$FQNBackup = get-item($BackupPath + $LatestSQLBackupDBFileName)
正如你所看到的,我在不同的地方测试了$ FQNBackup的输出,但它让事情变得更糟。我不确定如何在模块中定义它或如何转换/转换它。在声明了上面列出的$ FQNBackup变量之后,我会通过尝试执行此操作来修改它,就像之前在stackoverflow上找到的那样:
$FQNBackup = [System.IO.Path]::GetFullPath($FQNBackup)
我也尝试将它转换为字符串,但我可能做错了。看起来我应该能够:
1-获取路径
2-转换为字符串
3-将值作为字符串传递 到其他模块。
然而,从架构设计角度来看,这是“坏”吗?我应该保持相同的对象类型,而不是从不同的psm跳转?这是真正的问题。
答案 0 :(得分:1)
如果您需要构建一个包含2个字符串的路径,则通常使用Join-Path
cmdlet,例如像这样:
PS C:\> Join-Path 'C:\some\folder' 'file.ext'
C:\some\folder\file.ext
但是,在处理现有文件时,您只需使用文件对象的FullName
属性:
$FQNBackup = Get-ChildItem $BackupPath | Where-Object {
$_.LastWriteTime -gt "2014/02/01" -and $_.Name -like "$DBname*.bak"
} | Sort-Object LastWriteTime -Descending | select -First 1 -Expand FullName
字符串可以通过字符串参数传递给函数,例如像这样:
function Foo {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[string]$Bar
)
# do stuff
}
Foo -Bar 'some string'