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

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

Ответить
Настройки темы
PowerShell - [решено] Пути к файлам в Powershell 7

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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


Конфигурация

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


Изменения
Автор: DJ Mogarych
Дата: 05-03-2021
Привет!

Почему-то в модном Пауэршелле не работают пути, которые забиты в переменную. Например:
Код: Выделить весь код
Out-File:
Line |
   3 |  … coding UTF8 |Out-File "$path\$($_.basename).txt" -Encoding default
     |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Access to the path 'C:\Текст.txt' is denied.
В $path забито C:\temp\test, какого лешего он в C: пишет? Если вместо переменной вбить путь руками, работает нормально.

Такая же шляпа, если вызывать программу, например,
Код: Выделить весь код
$prog = "C:\scripts\prog1\exec.exe"
& "$prog" parameters
, то также не работает.

Почему, кто знает? Какой теперь способ прописывания путей?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 21:03, 05-03-2021

 

Ветеран


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

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


Цитата DJ Mogarych:
Access to the path 'C:\Текст.txt' is denied. »
У меня все работает, если хватает прав на запись. И вызов программы через переменную.

Отправлено: 22:27, 05-03-2021 | #2



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

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Мне непонятно, почему он пишет в корень-то, когда в переменной другой путь.

А вызов программы выдаёт такое:
Код: Выделить весь код
InvalidOperation:
Line |
   2 |  & "$prog" ".\$($_.name)" "$($_.basename)" -arg value
     |    ~~~~~~~~~~~~
     | The expression after '&' in a pipeline element produced an object that was not valid. It must result in a command name, a script block, or a CommandInfo object.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 05-03-2021 в 22:45.


Отправлено: 22:34, 05-03-2021 | #3


Ветеран


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

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


[q=DJ Mogarych]А вызов программы выдаёт такое: »

Я не могу придумать подходящий пример с пайпом, чтобы напрямую без Foreach-Object. Такой работает:
Код: Выделить весь код
$exe = "C:\Program Files\7-zip\7z.exe"
dir *.ps1 | % { & $exe a "$($_.basename).7z" "$($_.Name)" }
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:08, 05-03-2021 | #4


Аватара для Fors1k

Старожил


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

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


Цитата DJ Mogarych:
$prog = "C:\scripts\prog1\exec.exe"
& "$prog" parameters »
Код: Выделить весь код
$arg  = ni $env:TEMP\gg.txt -Value testString -Force
$prog = "C:\Windows\System32\notepad.exe"

& $prog $arg 
Такой код сработает?
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:27, 05-03-2021 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Да, ваши примеры работают. Вот что у меня:

Код: Выделить весь код
$tesseract = "C:\scripts\Tesseract\tesseract.exe"

PS C:\temp\ocr20210306092926> $images |ForEach-Object -Parallel {
>> & "$tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
>> } -ThrottleLimit $threads

InvalidOperation:
Line |
   2 |  & "$tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
     |    ~~~~~~~~~~~~
     | The expression after '&' in a pipeline element produced an object that was not valid. It must result in a command name, a script block, or a CommandInfo object.
InvalidOperation:
Line |
   2 |  & "$tesseract" ".\$($_.name)" "$($_.basename)" -l rus+eng
     |    ~~~~~~~~~~~~
     | The expression after '&' in a pipeline element produced an object that was not valid. It must result in a command name, a script block, or a CommandInfo object.
Вместе с тем, объект-то есть.
Код: Выделить весь код
PS C:\temp\ocr20210306092926> get-item $tesseract

    Directory: C:\scripts\Tesseract

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          27.11.2020    20:33         665382 tesseract.exe
И если забить путь руками, то всё работает:
Код: Выделить весь код
PS C:\temp\ocr20210306092926> $images |ForEach-Object -Parallel {
>> & "C:\scripts\Tesseract\tesseract.exe" ".\$($_.name)" "$($_.basename)" -l rus+eng
>> } -ThrottleLimit $threads
Tesseract Open Source OCR Engine v5.0.0-alpha.20201127 with Leptonica
Page 1
Tesseract Open Source OCR Engine v5.0.0-alpha.20201127 with Leptonica
Page 1
Tesseract Open Source OCR Engine v5.0.0-alpha.20201127 with Leptonica
Warning: Invalid resolution 0 dpi. Using 70 instead.
Estimating resolution as 146

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 06-03-2021 в 09:38.


Отправлено: 09:25, 06-03-2021 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
Вот что у меня »
Здесь

-------
scio me nihil scire. Ѫ


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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


YuS_2, это хорошо, но я всё равно не понял, в чём проблема, и почему это работало в PS 5.1.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:25, 06-03-2021 | #8


Аватара для Fors1k

Старожил


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

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


Цитата DJ Mogarych:
ForEach-Object -Parallel »
Ну теперь понятно. Почему сразу не выложить код?


Такие скриптблоки ничего не знают о переменных из внешней области.
Код: Выделить весь код
$arg  = ((ni $env:TEMP\gg.txt -Value testString -Force),
        (ni $env:TEMP\gg1.txt -Value testString -Force))
$prog = "C:\Windows\System32\notepad.exe"

$arg|ForEach -parallel{& $using:prog $_} 
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:09, 06-03-2021 | #9


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
почему это работало в PS 5.1 »
Да, именно так, как сказали выше, всё дело в параллельности, её не было у foreach-object в PS 5.1, параметр появился только с версии 7.0

-------
scio me nihil scire. Ѫ

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

Отправлено: 19:01, 06-03-2021 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Изменилось отображение пути к файлам после применения команды \\?\ biomirror Microsoft Windows 10 10 15-06-2017 13:23
CMD/BAT - [решено] что делать если bat в ascii а в пути к файлам папки с unicode именами? vsuwi Скриптовые языки администрирования Windows 12 31-08-2016 15:13
2008 R2 - [решено] файлы не удаляются с шары и ругань на пути к файлам santey007 Windows Server 2008/2008 R2 2 03-11-2015 10:40
VBS/WSH/JS - Срипт копирования пути к файлу\папке и вставка пути в письмо Outlook trlhrn Скриптовые языки администрирования Windows 0 07-08-2015 16:21
относительные пути к файлам pauluss Вебмастеру 3 09-01-2004 14:03




 
Переход