在PowerShell中执行shell命令时如何引用变量?

时间:2011-06-02 20:24:49

标签: powershell

我是PowerShell的新手。我的脚本下面有什么问题?它不想发出$config的值。但是,当我用双引号括起该命令时,一切看起来都没问题。

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

3 个答案:

答案 0 :(得分:3)

如果在它周围加上引号会产生正确的命令行,那么执行字符串内容的一种方法是使用Invoke-Expression(别名iex):

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

答案 1 :(得分:1)

"-config=$config"附近加双引号。如果没有这个,PowerShell会将-config=$config解释为一个恰好包含$符号的字符串参数。

答案 2 :(得分:0)

我认为您需要使用&启动perl命令,以便PowerShell将事物解释为命令而不是字符串。

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

另请参阅:Run a program in a foreach