使用定界符在 powershell 中拆分文件名

using a delimiter to split files names in powershell

我使用一个简单的功能来下载文件,return为了简单起见,我在更新计算机时使用了我的路径。

我一直在想为什么它不起作用然后意识到代理正在向文件名附加一个随机数所以它不是 12345.zip 它实际上是 8493830_12345.zip.

我尝试使用“_”作为分隔符来查找文件,但虽然没有错误,但文件没有被 returned,我已手动检查它是否存在。

function FileCheck {

$fileName.Split("_")[1]
$fileName = "{0}.zip" -f 12345
Download -ZipFileName $($fileName) -OutputDirectory $env:temp

$SleepTime  = 300 
$sleepElapsed  = 0
$sleepInterval = 20  


Start-Sleep $sleepInterval
$file = Get-ChildItem -Path $env:temp -Filter "$fileName*"
if ($file -ne $null) {
    return $file[0].FullName
 }

  Start-Sleep($sleepInterval)
  $sleepElapsed += $sleepInterval

  if (($SleepTime) -le $sleepElapsed){

# Check for file with given prefix
$file = Get-ChildItem -Path $env:temp -Filter "$fileName*"
if ($file -eq $null) {
    Write-Error 'file not found'
    return $null
}

return $file[0].FullName
}

}

我猜拆分不起作用,但谷歌搜索和移动 filename.split 对我不起作用。感谢任何帮助

好吧,你的拆分根本没有做任何事情。您还没有定义 $filename,但是如果您定义了,并且它有一个下划线,那么 $filename.split('_') 将 return 两个或多个字符串,具体取决于原始字符串中有多少下划线,但你永远不会捕捉到结果。我认为这里真正的问题是您稍后在函数中应用于 Get-ChildItem 的过滤器。

$file = Get-ChildItem -Path $env:temp -Filter "$fileName*"

这将查找以 $fileName 开头的文件,您在第 4 行定义为“12345.zip”。这与您想要寻找的恰恰相反。您需要将星号移到 $fileName 之前,因此它看起来像这样:

$file = Get-ChildItem -Path $env:temp -Filter "*$fileName"

这将 return 所有以“12345.zip”结尾的文件,其中包括:

myfuzzyhippo12345.zip
learn-to-count-12345.zip
8493830_12345.zip

基本上任何以 12345.zip 结尾的东西。此外,您似乎认为执行 return $file[0].fullnamereturn $null 会停止该功能。那是个错误。除非通过 break 命令之类的命令提前退出,否则函数会一直运行到完成。此外,所有未明确捕获或重定向的内容都将从该函数传回,因此阅读您的函数的人可能会获得您的 $filename.split('_') 行的输出,然后可能是 $null$filename[0].fullname .

最后,您似乎正在寻找文件,如果没有找到请稍等片刻,然后重试,直到 $sleepElapsed 大于 $sleepTime .您在这里想要的是 WhileDo/While 循环。这就是我要做的...

function FileCheck {
Param(
    $fileName = '12345.zip',
    $SleepTime  = 300, 
    $sleepElapsed  = 0,
    $sleepInterval = 20  
)

    Download -ZipFileName $($fileName) -OutputDirectory $env:temp

    Do{
        Start-Sleep $sleepInterval
        $sleepElapsed = $sleepElapsed + $sleepInterval
        $file = Get-ChildItem -Path $env:temp -Filter "*$fileName"|Select -First 1
    }While(!$file -and $sleepElapsed -le $sleepTime)
    $file.FullName
}

这让您可以根据需要在运行时定义诸如睡眠设置之类的东西,或者让它默认为您使用的内容,与文件名相同。然后它下载文件并查找它,在两次尝试之间暂停,直到它找到该文件,或者它用完了时间。然后它 returns $file.FullName 如果它找到一个文件,它是文件的路径,如果没有找到文件,则什么都不是。

就我个人而言,我会使用 return 文件对象,如果稍后我只需要 .FullName 属性 就可以了。通常(不总是,但通常)从一个函数中获得的更多信息 return 比更少的信息要好。如果下载失败并且它是一个零字节文件怎么办?仅 return 仅路径并不能告诉您这一点。