Что нового

[Данные, строки] Экранирование спецсимволов или как поместить кавычки в кавычки

Futurebear

Знающий
Сообщения
29
Репутация
6
Добрый день, понимаю для кого то этот вопрос покажется пустяковым, но для меня это вызвало проблему. Никак не получается поместить двойные и одинарные кавычки в блок с текстом

Код:
$ps_name='computer1'
$proc_name='iexplore.exe'
$user_name_pc='DOMEN\User'


$Cmd ="$proc_user=Get-WmiObject Win32_Process  -ComputerName "& $ps_name &" -Filter Name='"&$proc_name&"' |" &@CRLF & _
"ForEach-Object {  $ownerraw = $_.GetOwner(); $owner = '{0}\{1}' -f $ownerraw.domain, $ownerraw.user;" &@CRLF & _
"if($owner -eq '"&$user_name_pc&"'){$_ | Add-Member NoteProperty Owner $owner -PassThru} }" &@CRLF & _
"$proc_user | Remove-WmiObject "


строка должна быть такой
Код:
$proc_user=Get-WmiObject Win32_Process  -ComputerName $ps_name -Filter "Name='$proc_name'" |
 ForEach-Object {
 $ownerraw = $_.GetOwner();
 $owner = '{0}\{1}' -f $ownerraw.domain, $ownerraw.user;
if($owner -eq $user_name_pc){$_ | Add-Member NoteProperty Owner $owner -PassThru} } 
$proc_user | Remove-WmiObject


проблема на данном участке
Код:
-Filter Name='"&$proc_name&"'
-Filter "Name='$proc_name'"
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Futurebear
Если используются обрамляющие символы - кавычки, то они должны дублироваться в тексте. Если обрамляющие символы апострофы, то они должны дублироваться в тексте.
Например
Код:
$Cmd ="Слово ""Привет"""
MsgBox(0, 'Сообщение', $Cmd)


"Слово ""Привет"""
 
Автор
F

Futurebear

Знающий
Сообщения
29
Репутация
6
[box title=AZJIO]"Слово ""Привет"""[/box]

В том то и дело, что при данном способе не работает.
Вот пример, показывает процессы запущенные на ПК, с фильтром по процессу IE. Выдает ошибку. Если удалить строку -Filter ""Name='"&$proc_name&"'"", то все работает. Хотя в PowerShell работает и так и так.
Код:
#include <Constants.au3>
$ps_name='localhost'
$proc_name='iexplore.exe'
;~ $user_name_pc='DOMEN\User'


$Cmd ="$proc_user=Get-WmiObject Win32_Process  -ComputerName "& $ps_name &" -Filter ""Name='"&$proc_name&"'"" " &@CRLF & _
"$proc_user"


$PowerShell = Run('PowerShell.exe '&$Cmd, "", @SW_HIDE , $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)       

StdinWrite($PowerShell)

While 1
    $line = StdoutRead($PowerShell)
    If @error Then ExitLoop
    If $line <> "" Then
    MsgBox(0,"",$line)
    EndIf
Wend

While 1
    $line = StderrRead($PowerShell)
    If @error Then ExitLoop
    MsgBox(0,"",$line)
Wend
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Futurebear
Используя MsgBox проверяете валидность строки
Код:
$proc_name='iexplore.exe'
$Cmd ="-Filter ""Name='"&$proc_name&"'"" |"
MsgBox(0, 'Сообщение', $Cmd)

Если строка правильна, то она передаётся правильно и в командную строку. Проблема ещё может быть с путями, лучше всего указыать полный путь к iexplore.exe через @ProgramFilesDir или указать FileChangeDir
 
Автор
F

Futurebear

Знающий
Сообщения
29
Репутация
6
AZJIO
Проблемы с путями быть не может. Т.к. это просто параметр фильтра.
Запустите без -Filter ""Name='"&$proc_name&"'""
и вы увидите, что вылетает целый набор параметров по каждому процессу, для IE есть параметр Name = iexplore.exe.
Если фильтр не задавать то наких наборов целая куча.


Добавлено:
Сообщение автоматически объединено:

Следовательно дело не в строке, а в ее передаче и обработке(
В принципе тему можно закрыть,т.к. дело не в строке. Но что делать с проблемой?
Скрипт на PowerShell'e рабочий.
 
Автор
F

Futurebear

Знающий
Сообщения
29
Репутация
6
[box title=AZJIO]Осталось узнать что это такое, найти ссылку...[/box]
Пуск->Все программы->Стандартные->PowerShell

Ну вообще думаю как вариант можно попробовать запустить PowerShell не со строкой, а указать файл-скрипт PowerShell'овского формата
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Futurebear
Поиск в системных папках не дал результата, а в Стандартные то уж точно, я как бы за 12 лет меню своё выучил наизусть, оно уже сортировано сотни раз. Нашёл на oszone.net

В общем вставил в консоль
Код:
$proc_user=Get-WmiObject Win32_Process  -ComputerName localhost -Filter "Name='iexplore.exe'"
$proc_user
Результат - ничего.
 
Автор
F

Futurebear

Знающий
Сообщения
29
Репутация
6
В общем нашел обходное решение проблемы.

запустил файл скрипт
Код:
#include <Constants.au3>
;~ $ps_name='localhost'
;~ $proc_name='iexplore.exe'
;~ $user_name_pc='DOMEN\user'


;~ $Cmd ="$proc_user=Get-WmiObject Win32_Process  -ComputerName "& $ps_name &" -Filter ""Name='"&$proc_name&"'"" |" &@CRLF & _
;~ "ForEach-Object {  $ownerraw = $_.GetOwner(); $owner = '{0}\{1}' -f $ownerraw.domain, $ownerraw.user;" &@CRLF & _
;~ "if($owner -eq '"&$user_name_pc&"'){$_ | Add-Member NoteProperty Owner $owner -PassThru} }" &@CRLF & _
;~ "$proc_user | Remove-WmiObject "


$PowerShell = Run('PowerShell.exe '&" C:\1.ps1", "", @SW_HIDE , $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)       

StdinWrite($PowerShell)

While 1
    $line = StdoutRead($PowerShell)
    If @error Then ExitLoop
    If $line <> "" Then
    MsgBox(0,"",$line)
    EndIf
Wend

While 1
    $line = StderrRead($PowerShell)
    If @error Then ExitLoop
    MsgBox(0,"",$line)
Wend

почему-то вышло только так, но меня устраивает. :smile:

AZJIO
У вас win7? он по умолчанию в состав входит, на счет ХР не помню, но помоему был доп компонентой
Windows PowerShell — это новая командная оболочка Windows, разработанная в первую очередь для системных администраторов. Оболочка Windows PowerShell включает интерактивную командную строку и среду исполнения скриптов, которые можно использовать вместе или по отдельности.






Добавлено:
Сообщение автоматически объединено:

Спасибо за помощь ;)


Добавлено:
Сообщение автоматически объединено:

[box title=AZJIO]В общем вставил в консоль
Код: [Выделить]
$proc_user=Get-WmiObject Win32_Process -ComputerName localhost -Filter "Name='iexplore.exe'"
$proc_user
Результат - ничего.[/box]

Все верно. Эта команда выводит инфу о процессе iexplore.exe, но если он у вас не запущен, то и выводить нечего.

А мой скрипт завершал на указанном ПК, указанный процесс(в данном случае IE), запущенный от имени указанного пользователя.
 

Igni Serpens

Новичок
Сообщения
1
Репутация
0
Проблема просто решается: нужно изпользовать в коде амперсанд - &. Часть кода, где нужно изпользовать одинарные кавычки, закавычивается двойными, а та часть, где нужные двойные - одинарными. Например, вот эта строка
Код:
Run ($ThunderPath & ' -compose "' & "attachment='" & StringTrimRight($FileString, 1) & "'" & '"')


из моего скрипта для почтового вложения создаёт вывод, сочетающий оба вида кавычек:

Код:
C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe -compose "attachment='C:\Users\user\Desktop\file1.txt,C:\Users\user\Desktop\file2.txt'"
 
Верх