Обрабатывать файлы, перетаскиваемые в BAT-файл в PowerShell - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь создать сценарий, который будет преобразовывать файлы Markdown, которые сбрасываются в сценарии обработки.

Для этого я создал (process.bat), который будет передавать имена удаленных файлов всценарий PowerShell:

powershell.exe -NoProfile -File "./process.ps1" -Document %*
@pause

Файл PowerShell (process.ps1) обрабатывает каждый файл по отдельности:

[parameter(Mandatory=$true)]
[String[]]$Document

Write-Host $args[1]

$Document | ForEach-Object {
  Write-Host "Document: $_"

  # convert Markdown to Html
  pandoc -o ($_ -Replace '.md', '.html') -f markdown -t html $_
}

Когда я отбрасываю два файла в пакетный файл:

C:\Users\XXX\Documents\WindowsPowerShell\Scripts\Markdown>powershell.exe -NoProfile -File "./process.ps1" -Document "C:\Users\XXX\Documents\WindowsPowerShell\Scripts\Markdown\FOO.md"
"C:\Users\XXX\Documents\WindowsPowerShell\Scripts\Markdown\BAR.md"
C:\Users\XXX\Documents\WindowsPowerShell\Scripts\Markdown\BAR.md
Document: 
Press any key to continue . . .

Документы не обрабатываются.

Какой рекомендуемый подход для передачи списка файлов пакетного файла %* в PowerShell?

1 Ответ

1 голос
/ 23 сентября 2019

Когда powershell.exe, PowerShell CLI , вызывается извне с параметром -File , он не поддерживает массивы - только отдельные аргументы . [1]

(Кроме того, вы забыли обернуть определение параметра в блок param(...), что фактически привело кего следует игнорировать.)

Самое простое решение - определить ваш параметр с опцией ValueFromRemainingArguments, чтобы он автоматически собирал все позиционные аргументы в переменной параметра:

param(
  [Parameter(Mandatory, ValueFromRemainingArguments)]
  [String[]] $Document
)

Затем вызовите свой сценарий через интерфейс командной строки PowerShell без -Document:

powershell.exe -NoProfile -File "./process.ps1" %*

В качестве альтернативы использованию вспомогательного пакетного файла , вы можете:

  • определить файл ярлыка (*.lnk) , который явно вызывает ваш сценарий PowerShell как powershell.exe -File \path\to\your\script.ps1 (без дополнительных аргументов)

  • , а затем использовать , что в качестве цели отбрасывания .

Примечание. Причина, по которой вы не можете использовать сценарий PowerShell (*.ps1) напрямую в качестве цели удаления, заключается в том, что файлы сценариев PowerShell не непосредственно исполняемый - вместо этого, открыв (дважды щелкнув) файл *.ps1 , откройте его для редактирования .

Затем вам нужно будет добавить pause (или что-то похожее, например Read-Host -Prompt 'Press Enter to exit.') на ваш сценарий PowerShell, чтобы не допустить мгновенного закрытия окна по окончании.

Либо оставьте скрипт как есть и используйте -NoExit (помещенный перед -File), чтобы оставить сеанс PowerShell открытым.


[1] То же самое относится к PowerShell Core CLI , pwsh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...