Мне дали задание написать сценарий PS, который из списка машин в текстовом файле будет:
- Выведите IP-адрес машины
- Получите версию клиента SCCM на машине
- Создайте файл HTMl GPResult ИЛИ
- Укажите, что машина отключена
С окончательным условием запуска скрипта в фоновом режиме (Job)
У меня есть блок сценария, который будет делать все эти вещи, и даже формат вывода будет таким, как я хочу. То, что я не могу сделать, это заставить блок сценария вызывать исходный файл из того же каталога, что и сценарий. Я понимаю, что могу просто жестко закодировать каталоги, но я хочу иметь возможность запускать это на любом компьютере, в любом каталоге, поскольку мне нужно будет использовать сценарий в нескольких местах.
Какие-либо предложения?
Код выглядит следующим образом (Примечание: я пытаюсь понять, что я собрал из других статей, поэтому в нем есть фрагмент или два [последняя попытка заключалась в указании рабочего каталога], но основной код все еще там. Я также пришла идея сначала объявить блок сценария, как вы делаете с переменными на других языках программирования, но больше для удобства чтения, чем что-либо еще):
# List of commands to process in job
$ScrptBlk = {
param($wrkngdir)
Get-Content Hostnames.txt | ForEach-Object {
# Check to see if Host is online
IF ( Test-Connection $_ -count 1 -Quiet) {
# Get IP address, extracting only IP value
$addr = (test-connection $_ -count 1).IPV4Address
# Get SCCM version
$sccm = (Get-WmiObject -NameSpace Root\CCM -Class Sms_Client).ClientVersion
# Generate GPResult HTML file
Get-GPResultantSetOfPolicy -computer $_.name -reporttype HTML -path ".\GPRes\$_ GPResults.html"}
ELSE {
$addr = "Offline"
$sccm = " "}
$tbl = New-Object psobject -Property @{
Computername = $_
IPV4Address = $addr
SCCM_Version = $sccm}}}
# Create (or clear) output file
Echo "" > OnlineCheckResults.txt
# Create subdirectory, if it does not exist
IF (-Not (Get-Item .\GPRes)) { New-Item -ItemType dir ".\GPRes" }
# Get current working directory
$wrkngdir = $PSScriptRoot
# Execute script
Start-Job -name "OnlineCheck" -ScriptBlock $ScrptBlk -ArgumentList $wrkngdir
# Let job run
Wait-Job OnlineCheck
# Get results of job
$results = Receive-Job OnlineCheck
# Output results to file
$results >> OnlineCheckResults.txt | FT Computername,IPV4Address,SCCM_Version
Я ценю любую помощь, которую вы можете предложить.
Ваше здоровье.
~ DavidM ~
РЕДАКТИРОВАТЬ
Спасибо за помощь. Настройка рабочего каталога работает, но теперь я получаю новую ошибку. У него нет ссылки на строку, поэтому я не уверен, в чем может быть проблема. Новый код ниже. Я переместил sriptblock вниз, так что он отделен от остальной части кода. Я подумал, что это может быть немного аккуратнее. Прошу прощения за мое предыдущее форматирование кода. Я постараюсь сделать лучше с новым примером.
# Store working directory
$getwkdir = $PWD.Path
# Create (or clear) output file
Write-Output "" > OnlineCheckResults.txt
# Create subdirectory, if it does not exist. Delete and recreate if it does
IF (Get-Item .\GPRes) {
Remove-Item -ItemType dir "GPRes"
New-Item -ItemType dir "GPRes"}
ELSE{
New-Item -ItemType dir "GPRes"}
# Start the job
Start-Job -name "OnlineCheck" -ScriptBlock $ScrptBlk -ArgumentList $getwkdir
# Let job run
Wait-Job OnlineCheck
# Get results of job
$results = Receive-Job OnlineCheck
# Output results to file
$results >> OnlineCheckResults.txt | FT Computername,IPV4Address,SCCM_Version
$ScrptBlk = {
param($wrkngdir)
Set-Location $wrkngdir
Get-Content Hostnames.txt | ForEach-Object {
IF ( Test-Connection $_ -count 1 -Quiet) {
# Get IP address, extracting only IP value
$addr = (test-connection $_ -count 1).IPV4Address
# Get SCCM version
$sccm = (Get-WmiObject -NameSpace Root\CCM -Class Sms_Client).ClientVersion
Get-GPResultantSetOfPolicy -computer $_.name -reporttype HTML -path ".\GPRes\$_ GPResults.html"}
ELSE {
$addr = "Offline"
$sccm = " "}
$tbl = New-Object psobject -Property @{
Computername = $_
IPV4Address = $addr
SCCM_Version = $sccm}}}
Текст ошибки: Невозможно проверить аргумент для параметра ComputerName. Аргумент равен нулю или пуст. Укажите аргумент, который не может быть пустым или пустым, а затем попробуйте выполнить команду еще раз. + CategoryInfo: InvalidData: (:) [Test-Connection], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError, Microsoft.PowerShell.Commands.TestConnectionCommand + PSComputerName: localhost
$wrkngdir
, который отправляете в-ArgumentLIst
. Как насчетGet-Content (Join-Path -Path $wrkngdir -ChildPath 'Hostnames.txt')
. Кроме того, если я могу предложить, сделайте что-нибудь с отступом в коде, потому что теперь его действительно трудно читать ... - person Theo   schedule 26.10.2018