PDA

Показать полную графическую версию : обрезка спец символов и создание папки при копировании файла с очень длинным путем


9119
10-06-2021, 10:26
добрый.
Add-Type -assembly System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$main_form = New-Object System.Windows.Forms.Form
$main_form.Text ='автосборщик роликов (autoit + powershell)'
$main_form.Width = 700
$main_form.Height = 300
$main_form.AutoSize = $true


$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Width = 635
$TextBox.Height = 25
$TextBox.Location = New-Object System.Drawing.Point(25,65)
$TextBox.Text = "введите название ролика 1..."

$TextBox.Add_KeyDown({
if ($_.Modifiers -eq [System.Windows.Forms.Keys]::Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::A) {
$TextBox.SelectAll()
}
})
$main_form.Controls.Add($TextBox)


$TextBox1 = New-Object System.Windows.Forms.TextBox
$TextBox1.Width = 635
$TextBox1.Height = 25
$TextBox1.Location = New-Object System.Drawing.Point(25,110)
$TextBox1.Text = "введите название ролика 2..."

$TextBox1.Add_KeyDown({
if ($_.Modifiers -eq [System.Windows.Forms.Keys]::Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::A) {
$TextBox1.SelectAll()
}
})
$main_form.Controls.Add($TextBox1)


$TextBox2 = New-Object System.Windows.Forms.TextBox
$TextBox2.Width = 635
$TextBox2.Height = 25
$TextBox2.Location = New-Object System.Drawing.Point(25,155)
$TextBox2.Text = "введите название ролика 3..."

$TextBox2.Add_KeyDown({
if ($_.Modifiers -eq [System.Windows.Forms.Keys]::Control -and $_.KeyCode -eq [System.Windows.Forms.Keys]::A) {
$TextBox2.SelectAll()
}
})
$main_form.Controls.Add($TextBox2)

$button = New-Object System.Windows.Forms.Button
$button.Text = 'ок'
$button.Location = New-Object System.Drawing.Point(300,210)
$button.add_Click({Click_Button});
$main_form.Controls.Add($button)
function Click_Button
{
$main_form.Close()
}
$main_form.ShowDialog()



$name1 = $TextBox.Text;
$name2 = $TextBox1.Text;
$name3 = $TextBox2.Text;
$date = Get-Date -Format "ddMMyy"

Start-Process "C:\Users\Admin\Desktop\run1.exe" -Wait
Задача:

1) Значения TextBox.Text(1-3) пишутся в переменную, и нужны для дальнейшего использования при создании папки (п.2).
В связи с этим, нужно чтобы при вводе текста (посредством ctrl + V) в поле ввода - сразу же обрезались/удалялись спецсимволы (на которые ругается винда при создании папки при их наличии, т.е ",","/" и т.д), а остались только допустимые.
* т.е скопировал - ",те:к'ст/\", а при вставке в поле ввода осталось - текст
** как вариант можно $name1 = $TextBox.Text -replace '"', "" -replace '''', "" -replace ':', "" -replace ',', "" -replace '/', "" -replace '\\', "", но хотелось бы чтобы в поле ввода уже сразу попадал форматированный текст.

2) есть файл temp.mp4 по пути - очень\очень\очень\очень длинный путь с кучей символов, пробелов и русских букв\temp.mp4.
*при работе с этими путями в проводнике, часто натыкаюсь на ошибку - file path too long. Поэтому проблему очень длинного пути нужно обязательно учесть.
**видел где-то про то, что можно часть пути посадить в переменную (или что-то вроде того) и тогда проблема длинного пути уходит (не помню точно...)

нужно temp.mp4 скопировать по очень\длинному\пути с русскими буквами\$date-$name1\кс\$name1.mp4".
при этом папки "$date-$name1" с подпапкой "кс" - нет на момент копирования. Она должна создаваться.

3) изначальная папка с temp.mp4 - очень\очень\очень\очень длинный путь с кучей символов и русских букв\ - должна очищаться от всего содержимого, без удаления самой папки.


заранее спасибо за помощь.

greg zakharov
10-06-2021, 11:09
1) Некорректные символы для путей и файлов :
('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()}
Формируете из полученного набора регулярное выражение и применяете оператор -replace к тексту.

2) Если в системе разрешены длинные пути (>260 символов), лучше избегать рекурсии, отдав предпочтение обходу дерева каталога. Использование кириллицы лучше избегать в длинных путях (не только в виду схожести некоторых символов алфавитов, но и проблемы с буферной памятью).

3) см. пункт 2.

9119
10-06-2021, 11:28
greg zakharov, и тем не менее.. п.2 и п.3 надо работать как есть.
Какие есть варианты с обходом длинных путей?

greg zakharov
10-06-2021, 11:36
9119, не хотелось бы рубить с плеча и пороть горячку, нужно подумать как всё реализовать аккуратно.

9119
10-06-2021, 11:54
1)('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()} »
как из этого списка получить вид -replace 'символ', "" под каждый символ?
Или каждый знак ручками прописывать? )

2) и как именно подставить параметр -replace непосредственно к textbox.text ?
он сейчас выглядит так:
$TextBox.Text = 'ведите название ролика 1...'

greg zakharov
10-06-2021, 12:33
1) Для чего под каждый символ? Было же написано, что из полученных значений формируете регулярное выражение, которое и применяете к строке.

2) $TextBox.Text = "строка" -replace $regex где $regex - значение из пункта 1.

9119
10-06-2021, 13:04
greg zakharov,

$regex = ('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()}
$TextBox.Text = "строка" -replace $regex, ""

так? прошу прощения если вопросы дурацкие... напишите как правильно пожалуйста.




© OSzone.net 2001-2012