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
, то также не работает.
Почему, кто знает? Какой теперь способ прописывания путей?
|
Цитата:
Цитата 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.
|
[q=DJ Mogarych]А вызов программы выдаёт такое: »
Я не могу придумать подходящий пример с пайпом, чтобы напрямую без Foreach-Object. Такой работает:
Код:
$exe = "C:\Program Files\7-zip\7z.exe"
dir *.ps1 | % { & $exe a "$($_.basename).7z" "$($_.Name)" }
|
Цитата:
Цитата 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
|
DJ Mogarych |
06-03-2021 10:25 2951880 |
YuS_2, это хорошо, но я всё равно не понял, в чём проблема, и почему это работало в PS 5.1.
|
Цитата:
Цитата 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 $_}
|
Цитата:
Цитата DJ Mogarych
почему это работало в PS 5.1 »
|
Да, именно так, как сказали выше, всё дело в параллельности, её не было у foreach-object в PS 5.1, параметр появился только с версии 7.0
|
А я вот не пойму что работало в 5.1, если такого кода там вообще не может быть))
В 5.1 есть конечно параллельность, но именно такой записи там нет.
Тот, кого нельзя называть))
|
Цитата:
Цитата Fors1k
В 5.1 есть конечно параллельность »
|
да, есть, но работает она только в workflow (и не так, не в foreach-object), которые исключили в версиях PS новее 5.1
Цитата:
Цитата Fors1k
Тот, кого нельзя называть)) »
|
тс-с-с, а то услышит! :)
|
DJ Mogarych |
06-03-2021 22:05 2951924 |
|
Время: 00:31.
© OSzone.net 2001-