powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите со скриптом Powershell
25 сообщений из 28, страница 1 из 2
Помогите со скриптом Powershell
    #37610290
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь записать информацию о свободном месте на дисках в таблицу при помощи скрипта ниже.

Когда запускаю скрипт через джоб, выдает ошибку:
Unable to start execution of step 1 (reason: line(18): Syntax error). The step failed.

Я так понимаю, что ругается на эту строку:

$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($Output.DeviceId)', '$($Output.MediaType)', '$($Output.Size)', '$($Output.FreeSpace)')"

Если запускаю скрипт через командную строку Powershell, то все работает без ошибок, но вместо данных записывает нули:

Drive,MediaType,Size,FreeSpace
,0,0,0
,0,0,0
,0,0,0
,0,0,0
,0,0,0
,0,0,0
,0,0,0
,0,0,0

Причем строк с нулями в два раза больше чем надо, там всего четыре диска.

Когда запускаю команду $output из командной строки, то там все нормально:
DeviceId MediaType Size FreeSpace
-------- --------- ---- ---------
A: 5
C: 12 146154967040 105137184768
D: 12 536862916608 18457624576
E: 11


Вот сам скрипт:


$serverName = "MyServer"
$databaseName = "DBMonitor"

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Output = New-Object WMISearcher
$Connection.ConnectionString ="Server=$serverName;Database=$databaseName;trusted_connection=true;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

$Item = @("DeviceId", "MediaType", "Size", "FreeSpace")
$Output = Get-WmiObject Win32_logicaldisk | Format-Table DeviceId, MediaType, Size, FreeSpace -auto

foreach ($row in $Output) {
$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($Output.DeviceId)', '$($Output.MediaType)', '$($Output.Size)', '$($Output.FreeSpace)')"
$Command.ExecuteNonQuery() | out-null

}
$Connection.Close()
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37610371
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почему '$($Output.MediaType) а не '$($row.MediaType)'

зачем format-table, если никуда не выводится
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37610483
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin4почему '$($Output.MediaType) а не '$($row.MediaType)'

зачем format-table, если никуда не выводится

Спасибо, заработало!

А как еще сюда добавить условие, чтобы вставлять только те записи, где MediaType = 12
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37610488
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А из сиквельной джобы все равно не работает. Из коммандной строки - все прекрасно. :(

Ругается на 16-ю строку, это похоже там, где insert происходит:
Message
Unable to start execution of step 1 (reason: line(16): Syntax error). The step failed.


$serverName = "."
$databaseName = "DBMonitor"

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Output = New-Object WMISearcher
$Connection.ConnectionString ="Server=$serverName;Database=$databaseName;trusted_connection=true;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

$Item = @("DeviceId", "MediaType", "Size", "FreeSpace")
$Output = Get-WmiObject Win32_logicaldisk

foreach ($row in $Output) {
$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($Row.DeviceId)', '$($Row.MediaType)', '$($Row.Size)', '$($Row.FreeSpace)')"
$Command.ExecuteNonQuery() | out-null

}
$Connection.Close()
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37611774
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наберите в командной строке ? -?

Roust_mА из сиквельной джобы все равно не работает. Из коммандной строки - все прекрасно. :(

1. Я бы избавился от $output - вдруг в сиквеле такая переменная уже есть или что0нибудь типа того

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
Get-WmiObject Win32_logicaldisk | %{

   $Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')"

  $Command.ExecuteNonQuery() | out-null

} 
$Connection.Close()



2. Я бы прологгировал стейтменты типа

"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\log.txt

3. Я бы воспрользовался параметрами (вдруг ' это раздлелитель тысячных)

4. Могут быть проблемы с доступом у юзера из под которого выполнчется джоб
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37612317
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал команду выше, опять синтаксическая ошибка. Логгировать ее не получается, потому, что скрипт не запускается из-за синтаксической ошибки. Когда поменял
$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')"

на
$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('1', '12', '100', '50')"

все заработало, но мне естественно нужны реальные значения. Значит дело в строках типа '$($_.FreeSpace)').

Как использовать параметры я не разобрался. По ссылке там вообще всякие Си Шарп, а я не программист.

С правами у пользователя все в порядке (sa), да и ругается на синтаксическую ошибку.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37612318
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что вернуло ? -?

PS SQLSERVER:\SQL\342300-DEV26\DEFAULT\Databases\dbmonitor> ? -?

Name Category Synopsis
---- -------- --------
% Alias ForEach-Object
? Alias Where-Object
h Alias Get-History
r Alias Invoke-History


PS SQLSERVER:\SQL\342300-DEV26\DEFAULT\Databases\dbmonitor>
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37612332
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел обходной вариант: положил скрипт в текстовый файл и запускаю из джобы этот файл:
c:\temp\DSM.ps1

Все работает, но все-же интересно было бы разобраться, как заставить работать этот скрипт из самой джобы, без необходимости класть его в текстовый файл, ибо синхронизация этих файлов - лишняя головная боль.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37614050
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m,
? -? это я намекал посмотреть справку по where-object

а что будет если запустить такой же джоб в котором вместо вставки в SQL

Get-WmiObject Win32_logicaldisk > c:\mylog.txt
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37615634
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin4Roust_m,
? -? это я намекал посмотреть справку по where-object

а что будет если запустить такой же джоб в котором вместо вставки в SQL

Get-WmiObject Win32_logicaldisk > c:\mylog.txt

Все работает, вот что выдал лог файл:
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 105120432128
Size : 146154967040
VolumeName : C_DRIVE

DeviceID : D:
DriveType : 3
ProviderName :
FreeSpace : 18463850496
Size : 536862916608
VolumeName : New Volume

Самое интересное, что вставка тоже работает, если вместо значений типа ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" использовать что-то типа ('1', '2', '3', '4')"

А с ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" работает только если скрипт выложить в текстовый файл и потом его запускать из джобы.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37615808
belugin4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m,

осталось прологгировать получившийся SQL перед запуском
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37615811
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin4Roust_m,

осталось прологгировать получившийся SQL перед запуском

А как его прологировать? Да и вообще он не запускается, ибо ругается на синтаксическую ошибку. Почему-то когда тот-же скрипт из файла запускается, то синтаксическая ошибка куда-то чудным образом испаряется. :(
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37617215
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

Код: powershell
1.
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\0.log.txt



Может быть 1000 причин, начиная от разных прав, кончая разной версии среды. Кстати, выведите $host.version в лог тоже - сравним
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37617374
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginRoust_m,

Код: powershell
1.
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\0.log.txt



Может быть 1000 причин, начиная от разных прав, кончая разной версии среды. Кстати, выведите $host.version в лог тоже - сравним

Запускаю скрипт ниже, но лога не получается: синтаксическая ошибка в строке 11.

$serverName = "."
$databaseName = "DBMonitor"
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString ="Server=$serverName;Database=$databaseName;trusted_connection=true;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

Get-WmiObject Win32_logicaldisk -filter "MediaType=12" | %{
$Command.CommandText ="INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\temp\0.log.txt



$Command.ExecuteNonQuery() | out-null
}
$Connection.Close()




Date 1/16/2012 5:06:13 PM
Log Job History (_test)

Step ID 1
Server 342300-DEV26
Job Name _test
Step Name Test step
Duration 00:00:00
Sql Severity 0
Sql Message ID 0
Operator Emailed
Operator Net sent
Operator Paged
Retries Attempted 0

Message
Unable to start execution of step 1 (reason: line(11): Syntax error). The step failed.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37617375
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginRoust_m,

Код: powershell
1.
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\0.log.txt



Может быть 1000 причин, начиная от разных прав, кончая разной версии среды. Кстати, выведите $host.version в лог тоже - сравним

$host.version >> c:\temp\1.log.txt выдает:

Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37619288
b4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b4
Гость
Roust_m,

Надо убрать $Command.CommandText = и просто прологгировать SQL.

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$serverName = "." 
$databaseName = "DBMonitor"
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString ="Server=$serverName;Database=$databaseName;trusted_connection=true;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

Get-WmiObject Win32_logicaldisk -filter "MediaType=12" | %{
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\temp\0.log.txt
} 
$Connection.Close()
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37619310
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b4Roust_m,

Надо убрать $Command.CommandText = и просто прологгировать SQL.

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$serverName = "." 
$databaseName = "DBMonitor"
$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString ="Server=$serverName;Database=$databaseName;trusted_connection=true;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection

Get-WmiObject Win32_logicaldisk -filter "MediaType=12" | %{
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '$($_.MediaType)', '$($_.Size)', '$($_.FreeSpace)')" >> c:\temp\0.log.txt
} 
$Connection.Close()



Один фиг:

Message
Unable to start execution of step 1 (reason: line(11): Syntax error). The step failed.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37619478
b4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b4
Гость
Roust_m,

пока приходит в голову только убрать все вставленные переменные и добавлять по одной

начать с
Код: powershell
1.
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES (" >> c:\temp\0.log.txt
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37621297
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b4Roust_m,

пока приходит в голову только убрать все вставленные переменные и добавлять по одной

начать с
Код: powershell
1.
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES (" >> c:\temp\0.log.txt



Джоб с такой строкой вернул такой лог:

INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES (
INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES (

Попробовал добавить
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)'" >> c:\temp\0.log.txt
или:
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)')" >> c:\temp\0.log.txt
(разница в скобке в конце)
В обоих случаях синтаксическая ошибка и лога нет.
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37621299
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также пробовал:

"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('1', '2', '3', '$($_.FreeSpace)')" >> c:\temp\0.log.txt
...
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('$($_.DeviceId)', '2', '3', '4')" >> c:\temp\0.log.txt (все комбинации)

или:
"INSERT into DiskSpace ([Drive]) VALUES ('$($_.DeviceId)')" >> c:\temp\0.log.txt

Один фиг, - синтаксическая ошибка.

Работает только:
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('1', '2', '3', '4')"
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37623462
b4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b4
Гость
Roust_m,

Посмотрим что будет если не пользоваться подстановкой переменных в строчке
Код: powershell
1.
2.
3.
$_.DeviceId  >>log.txt
INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('" + $_.DeviceId + "')" >>log.txt
 
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37623464
b4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b4
Гость
b4,

еще $_ | gm >> log.txt
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37623466
b4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b4
Гость
b4Roust_m,

Посмотрим что будет если не пользоваться подстановкой переменных в строчке
Код: powershell
1.
2.
$_.DeviceId  >>log.txt
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('" + $_.DeviceId + "')" >>log.txt



конечно кавычка
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37623529
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b4b4Roust_m,

Посмотрим что будет если не пользоваться подстановкой переменных в строчке
Код: powershell
1.
2.
$_.DeviceId  >>log.txt
"INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('" + $_.DeviceId + "')" >>log.txt



конечно кавычка

Вот что я получил в логе:
C:
INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('C:')
D:
INSERT into DiskSpace ([Drive], [MediaType], [Size], [FreeSpace]) VALUES ('D:')
...
Рейтинг: 0 / 0
Помогите со скриптом Powershell
    #37623538
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b4b4,

еще $_ | gm >> log.txt

Эта команда ничего не записала в лог.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите со скриптом Powershell
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]