2011-06-02 85 views
1

我是PowerShell的新手。我的腳本有什麼問題?它不想發出$config的值。但是,當我用雙引號包裝該命令時,一切看起來都不錯。如何在PowerShell中執行shell命令時引用變量?

param($config, $logfolder) 

# Must run log analysis in chronological order. 
ls $logfolder | Sort-Object LastWriteTime | % { 
    perl D:\Websites\_awstats\wwwroot\cgi-bin\awstats.pl -LogFile="$($_.FullName)" -config=$config update 
} 

# Execute with - .\regen-logs.ps1 webgenesis "C:\inetpub\logs\LogFiles\W3SVC5" 
# Returns for each file - Error: Couldn't open config file "awstats.config.conf" nor "awstats.conf" after searching in path "D:\Websites\_awstats\wwwroot\cgi-bin,/etc/awstats,/usr/local/etc/awstats,/etc,/etc/opt/awstats": No such file or directory 

原來,發出和執行的東西似乎有作爲參數傳遞的「-config = $ config」。至少,這是我最好的猜測。我不知道$ _是否正常工作。

如果我在perl命令周圍加引號,就會得到我想要執行的命令。

ls $logfolder | Sort-Object LastWriteTime | % { 
    "perl D:\Websites\_awstats\wwwroot\cgi-bin\awstats.pl -LogFile=`"$($_.FullName)`" -config=$config update" 
} 

# Outputs for each log file something like - perl D:\Websites\_awstats\wwwroot\cgi-bin\awstats.pl -LogFile="C:\inetpub\logs\LogFiles\W3SVC5\u_ex110602.log" -config=webgenesis update 
+0

你是什麼意思與「當我用雙引號包裹該命令」?你能顯示工作版本嗎? – 2011-06-02 20:45:00

+0

您收到什麼錯誤消息? – 2011-06-02 20:50:33

回答

3

如果把引號圍繞它產生正確的命令行,執行字符串的內容的一種方式是Invoke-Expression(化名iex):

$v = "myexe -myarg1 -myarg2=$someVar" 
iex $v 
+0

就是這樣!謝謝。 – 2011-06-07 18:51:22

0

我認爲你需要開始你的Perl命令出與&,使PowerShell的事情解釋爲命令,而不是一個字符串。

& perl D:\Websites\_awstats\wwwroot\cgi-bin\awstats.pl -LogFile=`"$($_.FullName)`" -config=$config update 

此外,見:Run a program in a foreach

+0

術語'perl D:\ Websites \ _awstats \ wwwroot \ cgi-bin \ awstats.pl -LogFile =「D:\ Websites \ _awstats \ update-awstats.bat」-config = update「不被識別爲一個cmdlet,函數,腳本文件或可操作的程序。檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否正確,然後重試。 – 2011-06-02 20:56:20

+0

@ Stuart-Branham對不起。我搞砸了報價。思考這應該工作。 – 2011-06-02 21:41:10

+0

調用運算符「&」不能處理像這樣的複合表達式。見喬爾的答案。 – zdan 2011-06-02 21:50:51

1

把雙引號放在"-config=$config"左右。如果沒有這個,PowerShell會將-config=$config解釋爲只包含$登錄的字符串參數。