[英]How is this argument passed in C#?
我已經看到了此代碼段,但無法完全弄清楚為什么它可以成功運行。
class Program
{
public static void Main()
{
var startInfo = new ProcessStartInfo
{
FileName = "PowerShell.exe",
Arguments = @"-NoLogo -NoProfile ""Get-Content Queries.txt"" | Set-Content Output.tsv"
};
Console.WriteLine(startInfo.Arguments);
Process.Start(startInfo);
}
}
如果我嘗試執行powershell -NoLogo -NoProfile "Get-Content Queries.txt" | Set-Content Output.tsv
直接在命令提示符下powershell -NoLogo -NoProfile "Get-Content Queries.txt" | Set-Content Output.tsv
會引發錯誤消息,但是上面的代碼段可以成功完成。
如何處理代碼中的雙引號?
當您說命令提示符時,您的意思是cmd.exe嗎? 如果是這樣,則說明您正在處理cmd.exe的解析,並且無法處理|
很好,例如:
C:\>dir | foo.txt
'foo.txt' is not recognized as an internal or external command,
operable program or batch file.
如果我在PowerShell V4提示符下嘗試您的命令,則可以正常工作。 另外,在C#中執行的腳本使用PowerShell的命令行解析而不是cmd.exe的解析。
命令行參數使用空格作為定界符進行解析,這對於諸如路徑之類的帶有空格的東西(例如Get-Content Queries.txt
當然是個問題。 因此,為了解決這個問題,用雙引號引起來的任何參數都將避免這種類型的按空格分隔符進行解析。
那么為什么雙引號有效呢?
對於有問題的代碼,因為字符串以@
字符串文字作為前綴,所以允許雙引號而不進行轉義。 有關@
字符串文字修飾符如何工作的簡短文章(喬恩·斯凱特(Jon Skeet)同樣如此)可以在以下位置找到: @在字符串文字開始之前是什么意思? 。 引用一句話:
它的基本含義是:“直到到達下一個引號字符時,才對字符進行任何解釋”。 因此,逐字字符串文字可以包含反斜杠(不加倍),甚至可以包含行分隔符。 要在逐字文字中獲得雙引號(“),只需將其加倍...
但是手動復制到命令行不起作用,有什么不同?
因此,在將其復制到命令行時,它不會以完全相同的方式工作,因為它不包括Process.Start()
將參數包裝在另一個(等待它)中的額外步驟。引用! 如PowerShell和命令行中的雙引號所述 :
以下是一些可以使其正常工作的方法:
使用單引號:
powershell.exe C:\\Scripts\\ParamCheck.ps1 -Something 'one two'
使用反斜杠分隔符(即使PowerShell內部使用左單引號`):
powershell.exe C:\\Scripts\\ParamCheck.ps1 -Something \\"one two\\"
使用三個雙引號:
powershell.exe C:\\Scripts\\ParamCheck.ps1 -Something """one two"""
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.