簡體   English   中英

從 PowerShell 腳本調用 Windows 可執行文件,傳遞所有 arguments

[英]Call Windows executable from PowerShell script, passing all arguments

我翻遍了,找不到答案。 如果這是重復的,請指出我的問題,但我看到的大多數事情都有答案,go 繞圈子,談論各種復雜的事情,沒有直接的答案。

我的問題很簡單。 我有以下 Windows 批處理文件foo.bat

@ECHO OFF
bar.exe %*

如果我從命令行調用 foo.bat foobar foo.bat foobar 123 ,它會調用bar.exe foobar 123 這適用於沒有命令行 arguments 的情況。 這適用於多個命令行 arguments。

什么是等效的 PowerShell 腳本,它基本上做同樣的事情:調用另一個可執行文件,傳遞用戶提供的所有 CLI 參數?

我不認為這會很困難,但我肯定找不到任何直截了當的答案。

foo.bat 文件的foo.bat等效文件是:

bar.exe @args

PowerShell 將所有(未綁定的)位置 arguments [1]公開為存儲在自動$args變量中的數組。

通過在$args前面加上@而不是$ ,使用了參數飛濺,這意味着$args數組的元素作為單獨的 arguments 傳遞bar.exe

  • 注意:在調用外部程序(例如bar.exe )時,這不是絕對必要的 - $args也可以在那里工作 - 但更通用,因為它還可以正確地將命名的 arguments 傳遞給其他PowerShell命令,這些命令通常已聲明可以按名稱綁定的參數(例如, -Path C:\temp綁定值C:\temp到聲明的參數-Path

至於一般使用$args

  • $args.Count告訴您通過了多少(未綁定)位置 arguments,
  • $args[0]返回第一個這樣的參數, $args[1]返回第二個,以此類推。

但是,通常最好在 PowerShell 腳本和函數中正式聲明參數,然后它們也可以通過名稱綁定(例如, -FooParam foo而不是僅僅foo )。 有關更多信息,請參閱此答案


[1] 如果您的腳本沒有正式聲明任何參數(通過param(...)塊 - 請參閱about_Scripts鏈接的答案),則所有arguments 根據定義都是未綁定的(即未映射到聲明的參數)和位置(不以目標參數名稱為前綴)。 但是,如果您的腳本確實聲明了參數,則$args僅包含那些 arguments(如果有的話),除了綁定到聲明參數的那些之外,它們還被傳遞。 如果您的腳本是高級腳本(或函數) ,則根本不支持$args ,因為傳遞未綁定的 arguments 會被斷然阻止。 有關更多信息,請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM