использование разделителя для разделения имен файлов в powershell - PullRequest
1 голос
/ 22 февраля 2020

Я использую простую функцию, чтобы загружать файлы и возвращать мне путь при обновлении компьютеров для простоты.

Я застрял на том, почему он не работал, потом понял, что прокси-сервер добавляет случайное число к имени файла, поэтому вместо 12345.zip это фактически 8493830_12345.zip.

I Я попытался найти файл, используя "_" как разделение, но пока ошибок нет, файл не возвращается, и я проверил его там вручную.

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
}

}

Я предполагаю, что разделение не работает, но поиск в Google и перемещение имени файла. Split не работает для меня. Любая помощь приветствуется

1 Ответ

0 голосов
/ 22 февраля 2020

Ну, твой сплит ничего не делает. Вы не определили $filename, но если у вас есть, и у него есть подчеркивание, то $filename.split('_') вернет две или более строк, в зависимости от того, сколько подчеркиваний было в исходной строке, но вы никогда не получите результат. Я думаю, что реальная проблема здесь в том, что фильтр, который вы применяете к Get-ChildItem позже в вашей функции.

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

, который будет искать файлы, начинающиеся с $fileName, которые вы определяете в строке 4 как " 12345.zip». Это прямо противоположно тому, что вы хотите искать. Вам нужно переместить звездочку до $fileName, чтобы она выглядела следующим образом:

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

Это вернет все файлы, заканчивающиеся на «12345.zip», которые будут включать такие вещи, как:

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

В основном все, что заканчивается 12345.zip. Также кажется, что у вас сложилось впечатление, что выполнение return $file[0].fullname или return $null остановит функцию. Это ошибка Функция выполняется до завершения, если не завершена досрочно чем-то вроде break команды. Кроме того, все, что явно не перехвачено или перенаправлено, будет передано обратно из функции, поэтому при чтении вашей функции люди, скорее всего, получат вывод вашей строки $filename.split('_'), а затем, возможно, $null или $filename[0].fullname.

* 1022. * Наконец, кажется, что вы пытаетесь найти файл, если не нашли его немного подождать, и повторите попытку, пока $sleepElapsed не станет больше, чем $sleepTime. То, что вы хотите здесь, это While или Do/While l oop. Вот что я бы сделал ...
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
}

Это позволяет вам определять такие вещи, как настройки сна во время выполнения, если вы хотите, или просто оставить по умолчанию то, что вы использовали, то же самое с именем файла. Затем он загружает файл и ищет его, делая паузу между попытками, пока не найдет файл или не истечет время. Затем он возвращает $file.FullName, который является либо путем к файлу, если он его нашел, либо ничего, если он не нашел файл.

Лично я бы попросил его вернуть объект файла и просто использовать свойство .FullName, если это все, что я хотел позже. Обычно (не всегда, но обычно) больше информации, возвращаемой функцией, лучше, чем меньше информации. Как, например, если загрузка не удалась и это файл с нулевым байтом? Просто возвращение только пути не говорит вам этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...