#sql #powershell #xp-cmdshell #scriptblock
#sql #powershell #xp-cmdshell #scriptblock
Вопрос:
У меня есть скрипт, который отлично работает в powershell. Вы предоставляете ему видеофайл, и он сообщает вам все расширенные атрибуты.
Я пытаюсь выполнить это из XPCmdShell SQL, окружив его блоком сценария типа «amp;{мой код идет сюда}», но это не работает. Это говорит мне, что мне не хватает фигурных скобок, но я их хорошо завернул, так как я добавил одну пару для блокировки скрипта.
Может ли кто-нибудь с опытными глазами сказать мне, чего мне не хватает?
declare @cmd varchar(8000)
set @cmd = 'powershell -Command "amp;{
$InputObject = ''C:DownloadsPowershellScriptsTeststestvideo.mp4'';
$shell = New-Object -ComObject Shell.Application;
foreach($object in $InputObject)
{
if($object -is [string])
{
try
{
$object = Get-Item $object -ErrorAction Stop
}
catch
{
Write-Warning "Error while processing $object : $($_.exception.message)"
break
}
}
try
{
Test-Path $object -ErrorAction Stop
}
catch
{
Write-Warning "Error while processing $($object.fullname) : $($_.exception.message)"
break
}
switch ($object)
{
{$_ -is [System.IO.DirectoryInfo]}{
write-host Processing folder $object.FullName -ForegroundColor Cyan
$currentfolder = $shell.namespace($object.FullName)
$items = $currentfolder.items()
}
{$_ -is [System.IO.FileInfo]}{
write-host Processing file $object.FullName -ForegroundColor Cyan
$parent = Split-Path $object
$currentfolder = $shell.namespace($parent)
$items = $currentfolder.ParseName((Split-Path $object -Leaf))
}
}
try
{
foreach($item in $items)
{
0..512 | ForEach-Object -Begin {$ht = [ordered]@{}}{
if($value = $currentfolder.GetDetailsOf($item,$_))
{
if($propname = $currentfolder.GetDetailsOf($null,$_))
{
$ht.Add($propname,$value)
}
}
} -End {[PSCustomObject]$ht}
}
}
catch
{
Write-Warning "Error while processing $($item.fullname) : $($_.exception.message)"
}
}
}"'
print @cmd
exec xp_cmdshell @cmd
Комментарии:
1. Обычно ли работает такая многострочная команда? Сведите его к чему-то более простому, чтобы понять, в чем проблема (создайте рабочую однострочную строку, затем разделите ее на несколько строк без изменения фактического кода). Я подозреваю, что вы не можете сделать это таким образом. Если вы можете, вам все равно не нужно оборачивать его в другой блок сценариев. Также взгляните на
-EncodedCommand
параметр (он последний в списке, когда вы это делаетеpowershell /?
)2. «Это говорит мне, что мне не хватает фигурных скобок» пожалуйста, покажите нам полный текст сообщения об ошибке, которое вы получаете 🙂
3. Может быть, изменить
}}{
на};
, или} -Process {
?4. создайте скрипт по сетевому пути и запустите