Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   обрезка спец символов и создание папки при копировании файла с очень длинным путем (http://forum.oszone.net/showthread.php?t=348980)

9119 10-06-2021 10:26 2959901

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

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 2959904

1) Некорректные символы для путей и файлов :
Код:

('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()}
Формируете из полученного набора регулярное выражение и применяете оператор -replace к тексту.

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

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

9119 10-06-2021 11:28 2959910

greg zakharov, и тем не менее.. п.2 и п.3 надо работать как есть.
Какие есть варианты с обходом длинных путей?

greg zakharov 10-06-2021 11:36 2959913

9119, не хотелось бы рубить с плеча и пороть горячку, нужно подумать как всё реализовать аккуратно.

9119 10-06-2021 11:54 2959918

1)
Цитата:

Цитата greg zakharov
('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()} »

как из этого списка получить вид -replace 'символ', "" под каждый символ?
Или каждый знак ручками прописывать? )

2) и как именно подставить параметр -replace непосредственно к textbox.text ?
он сейчас выглядит так:
Код:

$TextBox.Text = 'ведите название ролика 1...'

greg zakharov 10-06-2021 12:33 2959924

1) Для чего под каждый символ? Было же написано, что из полученных значений формируете регулярное выражение, которое и применяете к строке.

2)
Код:

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

9119 10-06-2021 13:04 2959929

greg zakharov,

Код:

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

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


Время: 23:28.

Время: 23:28.
© OSzone.net 2001-