2011-06-02 84 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解释为只包含$登录的字符串参数。