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

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

DJ Mogarych 05-03-2021 21:03 2951846

Пути к файлам в Powershell 7
 
Привет!

Почему-то в модном Пауэршелле не работают пути, которые забиты в переменную. Например:
Код:

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

, то также не работает.

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

Foreigner 05-03-2021 22:27 2951858

Цитата:

Цитата DJ Mogarych
Access to the path 'C:\Текст.txt' is denied. »

У меня все работает, если хватает прав на запись. И вызов программы через переменную.

DJ Mogarych 05-03-2021 22:34 2951859

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

А вызов программы выдаёт такое:
Код:

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.


Foreigner 05-03-2021 23:08 2951861

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

Я не могу придумать подходящий пример с пайпом, чтобы напрямую без Foreach-Object. Такой работает:
Код:

$exe = "C:\Program Files\7-zip\7z.exe"
dir *.ps1 | % { & $exe a "$($_.basename).7z" "$($_.Name)" }


Fors1k 05-03-2021 23:27 2951862

Цитата:

Цитата 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

Такой код сработает?

DJ Mogarych 06-03-2021 09:25 2951875

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

Код:

$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


YuS_2 06-03-2021 10:14 2951878

Цитата:

Цитата DJ Mogarych
Вот что у меня »

Здесь

DJ Mogarych 06-03-2021 10:25 2951880

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

Fors1k 06-03-2021 12:09 2951884

Цитата:

Цитата 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 $_}


YuS_2 06-03-2021 19:01 2951903

Цитата:

Цитата DJ Mogarych
почему это работало в PS 5.1 »

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

Fors1k 06-03-2021 19:21 2951906

А я вот не пойму что работало в 5.1, если такого кода там вообще не может быть))
В 5.1 есть конечно параллельность, но именно такой записи там нет.
Цитата:

Цитата YuS_2
как сказали выше »

Тот, кого нельзя называть))

YuS_2 06-03-2021 20:21 2951915

Цитата:

Цитата Fors1k
В 5.1 есть конечно параллельность »

да, есть, но работает она только в workflow (и не так, не в foreach-object), которые исключили в версиях PS новее 5.1

Цитата:

Цитата Fors1k
Тот, кого нельзя называть)) »

тс-с-с, а то услышит! :)

DJ Mogarych 06-03-2021 22:05 2951924

Цитата:

Цитата Fors1k
$using:prog »

Вот геморрой-то.
Цитата:

Используйте область $using: для передачи ссылок на переменные в выполняемый блок скрипта.
https://docs.microsoft.com/ru-ru/pow...foreach-object

Спасибо!


Время: 00:31.

Время: 00:31.
© OSzone.net 2001-