Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Windows PowerShell 1.x/2.x/CTP

Автор: indgr
Дата сообщения: 13.08.2010 11:29
вся проблема в том что я не знаю как написать это. можешь мне помочь? написать пример?
Автор: resetsa
Дата сообщения: 16.08.2010 21:01
indgr так попробуй
cd '`[1`]'
Автор: indgr
Дата сообщения: 17.08.2010 11:29
это что такое?
Автор: resetsa
Дата сообщения: 18.08.2010 18:29
indgr
извини, это 2VovaMozg
Автор: berzSPB
Дата сообщения: 01.09.2010 10:47
уважаемые, нужен простой скрипт, копирующий из папки А в папку Б файлы, сохраняя исходную структуру каталогов папки А, - т. е. рекурсивно, причем нужно копировать не более 5 файлов через каждые 15 минут, -
Автор: ComradG
Дата сообщения: 04.09.2010 18:07
Кто-нибудь [more=так уже изголялся?]
function GenerateForm
{
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null

$frmMain = New-Object System.Windows.Forms.Form
$lblTime = New-Object System.Windows.Forms.Label
$btnTime = New-Object System.Windows.Forms.Button
$btnExit = New-Object System.Windows.Forms.Button
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#
#Events
#
$btnTime_OnClick=
{
$lblTime.Text = (Get-Date).ToString()
}

$btnExit_OnClick=
{
$frmMain.Close()
}

$OnLoadForm_StateCorrection=
{
$frmMain.WindowState = $InitialFormWindowState
}
#
#lblTime
#
$lblTime.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 14.25, 0, 3, 0)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 31
$lblTime.Location = $System_Drawing_Point
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.height = 23
$lblTime.Size = $System_Drawing_Size
#
#btnTime
#
$btnTime.Text = "Show"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 110
$System_Drawing_Point.Y = 61
$btnTime.Location = $System_Drawing_Point
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.height = 23
$btnTime.Size = $System_Drawing_Size
$btnTime.add_Click($btnTime_OnClick)
#
#btnExit
#
$btnExit.Text = "Close"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 110
$System_Drawing_Point.Y = 87
$btnExit.Location = $System_Drawing_Point
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.height = 23
$btnExit.Size = $System_Drawing_Size
$btnExit.add_Click($btnExit_OnClick)
#
#frmMain
#
$frmMain.Text = 'Clock'
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 210
$System_Drawing_Size.Height = 138
$frmMain.ClientSize = $System_Drawing_Size
$frmMain.Controls.Add($lblTime)
$frmMain.Controls.Add($btnExit)
$frmMain.Controls.Add($btnTime)
$frmMain.add_Load($OnLoadForm_StateCorrection)
$frmMain.ShowDialog() | Out-Null

$InitialFormWindowsState = $frmMain.WindowState
}

GenerateForm[/more]
Я тут повтыкал и пришел к весьма интересным открытиям: в скриптах PowerShell'а можно ведь по сути реализовывать перехватчики системных событий или нажатия клавиш. Вот только плохо, что по большей части все это требует прав администратора.
Автор: ComradG
Дата сообщения: 05.09.2010 12:02
Читая маны по PoSh'у (они у v2.0 на русском), не нашел толковой инфы по созданию пользовательских командлетов. Комрады, если кто сталкивался с сабжем, помогите, пожалуйста, разобраться.
Автор: Smitis
Дата сообщения: 11.09.2010 20:56
resetsa

Цитата:
так попробуй
cd '`[1`]'


Я так понимаю, это для меня было Пропустил...

Меня что удивляет, что одна команда (md) прекрасно работает и никакого экранирования специальных символов не требует, а другая, похожая (cd), требует. Какая-то неопределённость в использовании.
Кроме того, если запустить PS из командного файла и при этом в имени папки содержиться символ [, PS реально глючит.
Автор: ComradG
Дата сообщения: 12.09.2010 13:45
Smitis

Цитата:
Кроме того, если запустить PS из командного файла и при этом в имени папки содержиться символ [, PS реально глючит.

Правильно, ведь символы вроде [%{ и дыр и пыр обрабатываются в контексте командного сценария, так что если забить привычный синтаксис, то бишь вместо простого [ указать ^[^ галюнов не наблюдается.
Автор: Smitis
Дата сообщения: 14.09.2010 09:47
ComradG
Это понятно. Непонятно, почему они в одинаковом контексте по разному интерпретируются.
И вот ещё пример.
Допустим, есть папка c:\test
Командный файл test1.cmd

Код:
@echo off
cd /d c:\test
md aaa
cd aaa
echo. > file1.txt
echo. > file2.txt
echo ====================== CMD ===========================
dir
pause
echo ====================== PS ============================
powershell /c dir
pause
Автор: ComradG
Дата сообщения: 14.09.2010 14:32
Smitis
Во-первых, для чего что-либо с пошем нужно делать из батника, когда его синтаксис и так самомодостаточен, во-вторых, перечитай справку к пошу (у второй версии она полностью на русском) и поймешь свои ошибки, тем более ведь сам написал
Цитата:
Вру, заэкранировать спецсимволы "можно"!
Автор: Smitis
Дата сообщения: 14.09.2010 16:50
ComradG
Экранировать спецсимволы на уровне оси?
Когда специальные символы встречаются в ТЕКСТЕ сценария (исходном тексте, скрипте и т.п.) и их надо экранировать - это нормально. Это везде так. Но когда символ интерпретируется как специальный в имени папки (не в сценарии!) это, по моему, не нормально. В результате невозможно обработать папку, созданную другим процессом.

Я так понимаю, происходит следующее. PS запрашивает, ну скажем, имя текущей папки, скорее всего вызовом функции GetCurrentDirectoryW. Далее полученное имя он зачем-то обрабатывает так, как если бы брал это имя из текста сценария как литеральную строку. В результате имя папки преобразуется в хрен знает что, PS работать с ней неможет и без всяких предупреждений устанавливает текущей папкой корень диска C:\
Как я уже писал - бред. И про экранирование символов уточнял - в кавычках (т.е. никакое это не экранирование). И запуская PS из командного файла не делаю ничего предрассудительного и запрещенного. Вполне штатный запуск консольного приложения.

Возможно, я что-то делаю не так. Например версия PS не та (версия файла 6.0.6002.18111). Но уже четвёртый человек посылает меня к документации, даже не попытавшись проверить
Кстати, в документации нет объяснения, почему одна команда требует экранирования символов в строковом литерале, а другая нет.
Автор: ComradG
Дата сообщения: 14.09.2010 17:14
Smitis

Цитата:
Но уже четвёртый человек посылает меня к документации, даже не попытавшись проверить

Инсинуации вроде этих мог бы попридержать, так как я писал о том, что было мной разобрано, а не брал с потолка чего-то там, так что давай не будем впредь пререкаться (господа модераторы, прошу прощения за ) Во-первых, с чего ты взял, что пош оперирует вызовами вроде GetCurrentDirectoryW? У тебя ILDASM в наличии имеется? Так вот глянь в нем нетфорковскую либу System.dll, особенно внимательно изучи System.IO, тогда получишь представление о потоках в .NET и о принципе работы с папками и файлами вчастности, а самое главное поймешь где собака порылась (ты ведь сам, надо думать, хочешь разобраться, так?)
А вот
Цитата:
Экранировать спецсимволы на уровне оси?
это мне не совсем понятно. Зачем?
Из батника запускать пош все же на мой взгляд - это извра, нежели необходимость. По-моему, проще написать полноценный скрипт поша и юзать его.
Автор: Smitis
Дата сообщения: 14.09.2010 21:20
ComradG

Цитата:
с чего ты взял, что пош оперирует вызовами вроде GetCurrentDirectoryW

Любой дот.нет в конце концов сводится к вызовам winapi. В любом случае, будет вызвана некая функция (дот-нетовская) с аналогичным функционалом.

И да, я хочу разобраться.


Цитата:
Экранировать спецсимволы на уровне оси

Два моих примера - test2.cmd и test3.cmd
В том, который test2, PS не может вывести содержимое папки, содержащей символ [. Причём для самого PS в команде НИКАКИХ специальных символов не использовалось. Команда-то простая "powershell /c dir".
В примере test3.cmd кроме папки "[1]" создаётся вторая папка "`[1`]". Но это не папка в синтасисе PS! Это обычная папка, может быть, со странными символами, но тем не менее вполне обычная, может быть создана из проводника или тотала и т.п. и её существование никак не пересекается с папкой "[1]". Кроме PS! Потому что когда я создал папку "`[1`]" рядом с "[1]", PS вдруг начинает нормально работать и с папкой "[1]".

Не понимаю, почему запускать PS из CMD изврат? MS наложило табу на испольование командного процессора вместе с PS? Или тут просто религиозные (без обид) соображения? Я вначале вообще запускал скрипт PS совсем из другой программы (скрипт AutoIt). Хотел постепенно переложить весь функционал на PS. И на второй папке попался символ [ и всё запнулось. Причём для PS ни в скрипте ни в ком. строке символ [ НИГДЕ никак не фигурировал. Избавиться от символов [ в папках не могу. К тому же, ещё не проверял с другими "спецсимволами".
Автор: ComradG
Дата сообщения: 15.09.2010 13:39
Smitis

Цитата:
В любом случае, будет вызвана некая функция (дот-нетовская) с аналогичным функционалом.

Вот именно, ведь если бы пош обращался к WinAPI, то необходимости в установке .NET'а не было бы необходимости, хотя...

Цитата:
Не понимаю, почему запускать PS из CMD изврат?

Не изврат, а извра - две разные вещи.

Цитата:
MS наложило табу на испольование командного процессора вместе с PS?

Это вряд ли, и потом

Цитата:
Или тут просто религиозные (без обид) соображения?

религия здесь тоже не причем, просто я высказал свою точку зрения, исходя из которой я надеялся ты поймешь, что если пош предоставляет гораздо более широкие возможности, нежели cmd, то зачем напрягаться в отношении последнего? Но раз с подобными выводами ты не согласен, то давай разбираться вместе в отношении подобных галюнов поша из cmd. Итак, давай попорядку. Ты имел ввиду, что [ не воспринимается пошем? Но лично у меня запрос вроде powershell get-item [0] работает корректно.
Автор: ComradG
Дата сообщения: 24.09.2010 11:02
smail04
Пример создания ярлыка:

Код: $strDesktopFolder = [System.Environment]::GetFolderPath("Desktop")
$objShell = New-Object -com "Wscript.Shell"
$objShortcut = $objShell.CreateShortcut($strDesktopFolder + "\MyApp.lnk")
$objShortcut.TargetPath = "C:\Program Files\MyProgram\MyApp.exe"
$objShortcut.Save()
Автор: Aroun
Дата сообщения: 14.10.2010 19:12
Подскажите как реализовать, сабж здесь

И книжек на родном хотел бы почитать, в другом топике глухо как-то.
Автор: BVV63
Дата сообщения: 22.10.2010 06:49
Aroun

Цитата:
И книжек на родном хотел бы почитать, в другом топике глухо как-то.

Введение в Windows PowerShell
Пожалуй, единственная.

Добавлено:
Пардон, там ссылки битые. Тогда здесь:
Введение в Windows PowerShell
Последняя ссылка (uploadbox.com) рабочая.
Автор: Vital283
Дата сообщения: 01.11.2010 12:32
Вот еще одна рабочая ссылка
(под ковриком)

Автор: MedvedevDM
Дата сообщения: 04.11.2010 19:30

Цитата:
Подскажите как реализовать, сабж здесь


Делать было нечего и написал тут скриптик как пример работы с файлами:
Dest1 И Dest2 это корни папок, которые нужно сравнивать. Суть алгоритма. Берется рекурсивно все файлы из Папки1 и смотрится если такой файл в папке2. Если нету, то копируется, если есть, то проверятся есть ли модификации между файлами в Папке1 и папке2.

Второй цикл проверяет папку2. Берет рекурсивно все файлы, потом смотрит, есть ли такой файл в папке1 , если нету, то удаляет из папки2.

CLS
#задаем локации
$Dest1 = "D:\temp\Folder 1"
$Dest2 = "D:\temp\Folder 2"

#Проверяем папку 1 на присутствие файлов
Write-Host "!!!!____!!!! Приступаем к проверке папки 1"
ForEach ($File in (Get-ChildItem $Dest1 -Recurse))
{
Write-host "Обрабатываю" $File.fullname $File.LastWriteTime

#Задаем переменную с путем из второй папки.
$Dest1ToDest2= $File.FullName.Replace($Dest1, $Dest2)


#Проверяем существуюет ли файл во второй папке, который существует в папке 1
if ((Test-Path -path $Dest1ToDest2) -ne $True)
{
#Если файл не существует, то скопируем его из папки1 в папку2
Write-host "_______________Файла в Папке 2 не существует. Нужно скопировать из Папки 1"
Copy-Item $File.FullName $Dest1ToDest2 -Force
}
Else
{
#Файл существует. Значит будем проверять даты.
if ((Dir $File.FullName).LastWriteTime -gt (Dir $Dest1ToDest2).LastWriteTime)
{
#Файл существует, и в папке 1 изменения сделаны позже, чем в Папке 2
Write-Host "_______________Файл в папке 1 новее, чем в папке 2. Нужно скопировать"
Copy-Item $File.FullName $Dest1ToDest2 -Force
}
Else
{
Write-Host "_______________Файлы одинаковые. Обновление не требуется"
}
}
}

Write-Host "!!!!____!!!! Приступаем к проверке папки 2"
#Проверяем папку 1 на присутствие файлов
ForEach ($File in (Get-ChildItem $Dest2 -Recurse))
{

Write-host "Обрабатываю" $File.fullname $File.LastWriteTime

#Получаем ссылку на аналогичный файл в Папке1
$Dest2ToDest1= $File.FullName.Replace($Dest2, $Dest1)

#Проверяем существуюет ли файл в первой папке
if ((Test-Path -path $Dest2ToDest1) -ne $True)
{
Write-Host "_______________Файл не существует в Папке1. Нужно удалить из папки 2"
#Если файл не существует, то скопируем его из папки1 в папку2
Remove-Item $File.FullName -Force
}
else
{
Write-Host "_______________Файл существует в Папке1."
}

}
Автор: 01MDM
Дата сообщения: 05.11.2010 15:39
MedvedevDM
Еще можно так сравнить:

Код:
$dest1 = gci -recurse C:\Temp\Folder1
$dest2 = gci -recurse C:\Temp\Folder2

diff $dest1 $dest2 | % { $_.InputObject.fullname }
Автор: BVV63
Дата сообщения: 11.11.2010 10:45
Подскажите, пожалуйста, как из скрипта узнать его местонахождение? Что-нить аналогичное %~DP0 в батнике.
Автор: 01MDM
Дата сообщения: 11.11.2010 12:29
BVV63

Цитата:
Подскажите, пожалуйста, как из скрипта узнать его местонахождение?

Директорию скрипта:

Код:
(Get-Item $MyInvocation.MyCommand.Definition).DirectoryName
Автор: FlaMeKoda
Дата сообщения: 13.11.2010 08:49
День добрый.
Помогите разобрать Сценарий в PowerShell.
get-QADObject -SearchRoot "tb.local/NSK/Disabled User Accounts" -SizeLimit 0 -Type User| Where-Object {$_.Email -like '*@*' }
| where-object {-(new-timespan -end ($_.whenchanged)).days -gt 31} |
ForEach-Object {Disable-MailBox $_.Email -Confirm:$False; Disable-MailUser $_.Email -Confirm:$False ;Set-QADUser $_.DN -Email ''}

Вот например командер Where-Object берёт свойства объекта {$_.Email -like '*@*' } вот -like '*@*' что такое?
Автор: 01MDM
Дата сообщения: 13.11.2010 16:23
FlaMeKoda

Цитата:
-like '*@*' что такое?

Это маска, по которой ищут нужные вхождения.

PS. Поскольку очень далек от администрирования отличного от localhost, то подозреваю, что скрипт ищет "мертвые души" по наличию/отсутствию eMail'а.
Автор: FlaMeKoda
Дата сообщения: 15.11.2010 07:35
Может быть у кого стоит оснастка для работы с exchange вытащите Help в фаил из неё.
Автор: BVV63
Дата сообщения: 15.11.2010 08:36
FlaMeKoda
Не понял... Help-файл нужен? Оснасткой пользуюсь. А от какой версии нужно-то? Или без разницы?
Автор: FlaMeKoda
Дата сообщения: 15.11.2010 09:25
Вопрос про хелп снят. Нашёл таки под 32х битную систему дистриб. Возьму там.
Автор: FlaMeKoda
Дата сообщения: 16.11.2010 09:42
Может кому пригодиться

get-QADObject -SearchRoot "tb.local/NSK/Disabled User Accounts" -SizeLimit 0 -Type User
# В tb.local/NSK/Disabled User Accounts ищем юзеров (для получения полного списка прописываем лимит 0, по умолчанию 1000)
Where-Object {$_.Email -like '*@*' }
# Из полученных объектов берём объекты по атрибуту Email не понял что делает оператор -like. Догадываюсь что ищет включение, в данном случае ищет собаку в поле адреса
where-object {-(new-timespan -end ($_.whenchanged)).days -gt 31}
# Выбираем обекты по атрибуту whenchanged старше 31 дня
ForEach-Object {Disable-MailBox $_.Email -Confirm:$False; Disable-MailUser $_.Email -Confirm:$False ;Set-QADUser $_.DN -Email ''}
# Передаём данные после всех сортировок в командлер ForEach который дёргае каждый обект по отдельности и применяет к нему
# 1- отвязывает у.з. в AD от почтового ящика на Эксченже 2 - Запрещает юзеру пользоваь емаил.
Автор: Suprus
Дата сообщения: 18.11.2010 08:50
Добрый день!
Подскажите как реализовать, сортировку файлов по папкам (по ВРЕМЕНИ создания, не по дате, т.е чтобы скрипт создавал новые папки по формату ЧЧ-ММ и туда сортировал файлы).

Спасибо!

Страницы: 1234567

Предыдущая тема: Assembler


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.