Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - обрезка спец символов и создание папки при копировании файла с очень длинным путем

Ответить
Настройки темы
PowerShell - обрезка спец символов и создание папки при копировании файла с очень длинным путем

Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


Изменения
Автор: 9119
Дата: 10-06-2021
добрый.
Имеем такой скрипт с формой:
Код: Выделить весь код
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 - очень\очень\очень\очень длинный путь с кучей символов и русских букв\ - должна очищаться от всего содержимого, без удаления самой папки.


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

Отправлено: 10:26, 10-06-2021

 

Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


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

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

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

Последний раз редактировалось greg zakharov, 10-06-2021 в 11:16.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:09, 10-06-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:28, 10-06-2021 | #3


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


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

Отправлено: 11:36, 10-06-2021 | #4


Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось 9119, 10-06-2021 в 12:29.


Отправлено: 11:54, 10-06-2021 | #5


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


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

2)
Код: Выделить весь код
$TextBox.Text = "строка" -replace $regex
где $regex - значение из пункта 1.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:33, 10-06-2021 | #6


Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


greg zakharov,

Код: Выделить весь код
$regex = ('FileName', 'Path').ForEach{[IO.Path]::"GetInvalid$($_)Chars"()}
$TextBox.Text = "строка" -replace $regex, ""
так? прошу прощения если вопросы дурацкие... напишите как правильно пожалуйста.

Отправлено: 13:04, 10-06-2021 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - обрезка спец символов и создание папки при копировании файла с очень длинным путем

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Создание текстового файла с набором символов 4zz Скриптовые языки администрирования Windows 22 28-03-2019 13:11
проблема удаления множества файлов с длинным путем kupall Хочу все знать 10 19-01-2015 22:44
Доступ - Ошибка при копировании файла или папки. wertu1234321 Microsoft Windows 2000/XP 2 05-03-2013 22:26
CMD/BAT - [решено] Анализ на количество символов в названии файла/папки айкот Скриптовые языки администрирования Windows 8 04-10-2011 16:12
Ошибка при копировании папки или файла CarBon Microsoft Windows 2000/XP 4 14-05-2009 22:22




 
Переход