Метод обнаружения Powershell — Путь к файлу существует, и если да, проверьте размер файла

#powershell #sccm

Вопрос:

Я немного запутался в этом, и я надеюсь, что кто-нибудь сможет помочь мне разобраться в этом:

Мне было поручено поместить файл пользовательских настроек в перемещаемый профиль пользователя, вошедшего в систему на всех рабочих станциях. Файл необходимо будет развернуть, если одно из 2 условий выполнено правильно:

  1. Файла там нет.
  2. Размер файла меньше, чем тот, который развертывается.

Метод развертывания хорош, но метод обнаружения вызывает у меня головную боль.

Блог Энди Доусона заставил меня проделать большую часть этого пути, для меня не работает бит размера (длины) файла.

Итак, мой первый сценарий выглядел так:

Часть 1. Войдите в систему пользователя

 Function CurrentUser {
     $LoggedInUser = get-wmiobject win32_computersystem | select username
     $LoggedInUser = [string]$LoggedInUser
     $LoggedInUser = $LoggedInUser.split(“=”)
     $LoggedInUser = $LoggedInUser[1]
     $LoggedInUser = $LoggedInUser.split(“}”)
     $LoggedInUser = $LoggedInUser[0]
     $LoggedInUser = $LoggedInUser.split(“”)
     $LoggedInUser = $LoggedInUser[1]
     Return $LoggedInUser
}
 

Часть 2. Назначение переменных Пути пользователя и целевого файла

 $user = CurrentUser
$path = C:Users" $user "AppDataRoamingfolderfoldersettings.cfg"
$targetfile = Get-Item $path
 

Часть 3. Обнаружение существующего пути и проверка размера файла

 if (( Test-Path $targetfile) -and ((Get-Item $targetfile).length -ge 26831))
{
Write-Host "installed"
}
else
{
Write-Host "NOT installed"
}
 

Это работает, если выполняется условие 1, но в противном случае метод обнаружения потерпит неудачу из-за $path переменной и, следовательно $targetfile , не может быть заполнен.

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

Начать всё с начала. Похоже, мне нужно начать только с остальной части сценария, так как условие is 1 НЕ выполнено, так что…

…Мой второй (текущий) сценарий выглядит так:

Часть 1. Войдите в систему пользователя UNCHANGED THIS BIT'S FINE, BECAUSE IS STOLE IT :)

Часть 2. Назначение переменных пользователя и пути пользователя (упрощенно, так как эта переменная всегда будет найдена)

 $user = CurrentUser
$Userpath = "C:Users" $user
 

Часть 3: Если путь ОТСУТСТВУЕТ, состояние существует и проверьте размер файла

 if (-not (Test-Path "$UserpathAppDataRoamingfolderfoldersettings.cfg"))
{
Write-Host "NOT installed"
}
elseif.....
 

…и вот тут начинается колея! Я хочу, чтобы вторая проверка была такой же, ((Get-Item $targetfile).length -ge 26831)) как и раньше, но я просто не могу понять синтаксис/логику прямо здесь.

Любая помощь будет очень признательна!!!

Комментарии:

1. Одной скобкой справа меньше, и -le для более короткого файла должно хватить. -lt Или в случае, если вам нужно, чтобы размер файла строго соответствовал вашему значению.

2. Спасибо, хотя, если вы имеете в виду «((Get-Item $targetfile). длина -ge 26831))` фрагмент в конце поста, на самом деле это была опечатка с моей стороны, и просто пример. Я обновлю сообщение соответствующим образом.

3. На самом деле, я не вижу, как отредактировать post…so думаю, я оставлю это 🙂

Ответ №1:

Вы захотите проверить, не существует ли файл или он слишком мал:

 if(-not(Test-Path $targetFile) -or (Get-Item $targetFile).Length -lt $newFileSize){
  # File either doesn't exist or is incomplete - go ahead and copy the new config file to $targetFile
  Copy-Item .pathtoreferenceconfig.cfg -Destination $targetFile -Force
}
 

Комментарии:

1. Спасибо, Матиас. Однако проблема, с которой я столкнулся, заключается в том, как/когда назначить переменную $targetfile. Если я сделаю это, потому что если условный раздел запускается, метод обнаружения завершится неудачей из-за Get-Item : Cannot find path ошибки.

2. Вот почему, похоже, мне пришлось отказаться от установки переменной до тех пор, пока скрипт не подтвердит ее существование со if (-not (Test-Path "$UserpathAppDataRoamingfolderfoldersettings.cfg")) строкой

3. Ты пробовал? 🙂 Мой ответ уже решает эту проблему — правое выражение -or операции выполняется только при сбое левого выражения, поэтому Get-Item $targetFile оно выполняется только тогда, когда файл существует .

4. @Jimbobbily Вы хотите $targetFile = "$userAppDataRoamingfolderfoldersettings.cfg" — мы просто хотим сохранить путь к файлу , ничего больше

5. Я проверил это. Это настройка переменной, которую я здесь не получу « $user = текущий пользователь $Путь пользователя = «C:Users» $user $targetFile = Получить элемент «$userAppDataРоумингпапкапапканастройки.cfg», если(-не(Тестовый путь $targetFile) -или (Получить элемент $targetFile). Длина -26830 лт) { Запись-Хост «НЕ установлен» } еще { } « Это заканчивается ошибкой «Get-Item : Не удается найти путь». Это в первом командлете Get-Item