#powershell #sccm
Вопрос:
Я немного запутался в этом, и я надеюсь, что кто-нибудь сможет помочь мне разобраться в этом:
Мне было поручено поместить файл пользовательских настроек в перемещаемый профиль пользователя, вошедшего в систему на всех рабочих станциях. Файл необходимо будет развернуть, если одно из 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