Мне было дано задание написать сценарий PS, который из списка машин в текстовом файле будет:
- Вывести IP-адрес машины
- Получитьверсия клиента SCCM на компьютере
- Создание файла HTMl GPResult ИЛИ
- Укажите, что машина находится в автономном режиме
С окончательным условием выполнения сценарияна заднем плане (задание)
У меня есть скрипт-блок, который будет выполнять все эти вещи, и даже форматировать выходные данные, как я хочу.То, что я не могу , похоже, сделать, это получить блок скриптов для вызова исходного файла из той же директории, что и скрипт.Я понимаю, что могу просто жестко закодировать каталоги, но я хочу иметь возможность запускать это на любом компьютере, в любом каталоге, так как мне потребуется использовать сценарий в нескольких местах.
Есть предложения?
Код выглядит следующим образом (Примечание: я пытаюсь найти материал из других статей, поэтому в нем есть фрагмент или два [самая последняя попытка была указать рабочий каталог], но ядрокод все еще там. У меня также была идея сначала объявить блок скриптов, как вы делаете это с переменными в других языках программирования, но больше для удобства чтения):
# 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 ~
РЕДАКТИРОВАТЬ
Спасибо за всю помощь.Настройка рабочего каталога работает, но теперь я получаю новую ошибку.У него нет ссылки на строку, поэтому я не уверен, где может быть проблема.Новый код ниже.Я переместил блок скриптов в дно, так что он отделен от остальной части кода.Я думал, что это может быть немного аккуратнее.Я прошу прощения за мое раннее форматирование кода.Я попытаюсь сделать лучше с новым примером.
# 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