Создание виртуальных хостов для wampserver с powershell - PullRequest
3 голосов
/ 25 августа 2011

Я пытаюсь создать виртуальные хосты с помощью скрипта Powershell. Работает нормально, но у меня проблемы с кодировкой. Я перепробовал все допустимые значения переключателя -encoding, но безуспешно.

Вот мой сценарий

$hostName = $args[0];
if ($args -eq $null -or $args.Length -eq 0)
{
    "No arguments. Supply the virtual host name as the first argument."
    exit
}
if (!(Test-Path -path D:\wamp\$hostName))
{
    $indexText = "<?php echo `"<h1>Holder for $hostName</h1>`";"
    New-Item D:\wamp\$hostName -type directory
    New-Item D:\wamp\$hostName\index.php -type file
    Out-File -FilePath D:\wamp\$hostName\index.php -InputObject $indexText -Encoding UTF8
}
$hosts = Get-Content C:\Windows\System32\drivers\etc\hosts
$hosts = $hosts + "127.0.0.1 $hostName.localhost"
Out-File -FilePath C:\Windows\System32\drivers\etc\hosts -InputObject $hosts
$conf = Get-Content "C:\Program Files (x86)\wamp\bin\apache\Apache2.2.11\conf\extra\httpd-vhosts.conf"
$conf = $conf + "<VirtualHost *:80>"
$conf = $conf + "    DocumentRoot `"D:/wamp/$hostName`""
$conf = $conf + "    ServerName $hostName.localhost"
$conf = $conf + "    ErrorLog `"logs/$hostName.localhost-error.log`""
$conf = $conf + "    CustomLog `"logs/$hostName.localhost-access.log`" common"
$conf = $conf + "</VirtualHost>"
Out-File -FilePath "C:\Program Files (x86)\wamp\bin\apache\Apache2.2.11\conf\extra\httpd-vhosts.conf" -InputObject $conf -Encoding ascii
Write-Host "Restart wamp server to effect changes"

Кому-нибудь удалось надежно заставить это работать, или я здесь начинающий? Я всегда могу использовать PHP вместо этого:)

Если кодировка неверна, Apache отказывается запускаться под wampserver. Если я поменяю кодировку в notepad ++ на ANSI, то все будет нормально, но powershell не нравится -encoding ANSI.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

использование опции -Encoding OEM на Out-File, кажется, является решением этой проблемы, если кто-то еще сталкивается с ней.

Например: -

Out-File -FilePath "C:\Program Files (x86)\wamp\bin\apache\Apache2.2.11\conf\extra\httpd-vhosts.conf" -InputObject $conf -Encoding OEM

Редактировать: -
В конце концов я решил эту проблему, переписав скрипт на PHP, так как не смог заставить его работатьпоследовательно в Powershell.Вот мой сценарий, если другие считают его полезным, он предназначен для запуска из командной строки, например: -

php d:/scripts/newVHost.php www

Создает новый вызов виртуального хоста 'www'.

<?php
/**
 * create a new vhost on this server
 * 
 * @param host name
 */
$ds = DIRECTORY_SEPARATOR;
$eol = PHP_EOL;

// you may need to alter this if your host file is elsewhere
$hostsFile = "C:\Windows\System32\drivers\etc\hosts";
$hostFH = fopen($hostsFile, 'a+');

// you may need to alter this if your htttp-vhosts.conf file is elsewhere
$apacheVHfile = "C:\Program Files\wamp\bin\apache\Apache2.2.17\conf\extra\httpd-vhosts.conf";
$apacheFH = fopen($apacheVHfile, 'a+');

if($argc <= 1) die("You must specify a host name\n");
$hostName = $argv[1];
$pathName = "d:{$ds}www{$ds}$hostName";
echo "\nCreating new virtual host '$hostName'\n";

if(!file_exists($pathName)) mkdir($pathName);

$writeStr = "\n127.0.0.1       $hostName.localhost";
writeFile($hostFH, $writeStr, $hostsFile);

$writeStr = "<VirtualHost *:80>
    DocumentRoot \"$pathName\"
    ServerName $hostName.localhost
    ErrorLog \"logs{$ds}$hostName.localhost-error.log\"
    CustomLog \"logs{$ds}$hostName.localhost-access.log\" common
</VirtualHost>$eol";

writeFile($apacheFH, $writeStr, $apacheVHfile);

fclose($hostFH);
fclose($apacheFH);

echo "New virtual host $hostName created. Restart WAMP server\n";
    echo "\n===================================\n\n";

function writeFile($file, $writeStr, $fileName = null){
    $written = fwrite($file, $writeStr);
    if($written){
        echo "\nModified $fileName\n";
    } else echo "\nCould not Modify $fileName\n";
}
1 голос
/ 30 мая 2014

Я думаю, вы забыли закрыть тег php в:

$indexText = "<?php echo `"<h1>Holder for $hostName</h1>`"; **?>**"

Обновление: я переписал ваш скрипт и получаю согласованные результаты со следующими данными:

function vhost() 
{
    $hostName = $args[0];
    if ($args -eq $null -or $args.Length -eq 0)
    {
    "No arguments. Supply the virtual host name as the first argument."
    }
    if (!($args -eq $null -or $args.Length -eq 0))
    {
        if (!(Test-Path -path C:\wamp\www\$hostName))
        {
        $indexText = "<?php echo `"<h1>Success! Virtual host for $hostName created.</h1>`"; ?>"
        New-Item C:\wamp\www\$hostName -type directory
        New-Item C:\wamp\www\$hostName\index.php -type file
        Out-File -FilePath C:\wamp\www\$hostName\index.php -InputObject $indexText -Encoding UTF8
        }
        $hosts = Get-Content C:\Windows\System32\drivers\etc\hosts
        $hosts = $hosts + "127.0.0.1`t$hostName"
        Out-File -FilePath C:\Windows\System32\drivers\etc\hosts -InputObject $hosts
        $conf = Get-Content "C:\wamp\bin\apache\apache2.2.22\conf\extra\httpd-vhosts.conf"
        $conf = $conf + "<VirtualHost *:80>"
        $conf = $conf + "    DocumentRoot `"c:/wamp/www/$hostName`""
        $conf = $conf + "    ServerName $hostName"
        $conf = $conf + "    ServerAlias $hostName"
        $conf = $conf + "    ErrorLog `"logs/$hostName-error.log`""
        $conf = $conf + "    CustomLog `"logs/$hostName-access.log`" common"
        $conf = $conf + "</VirtualHost>"
        Out-File -FilePath "C:\wamp\bin\apache\apache2.2.22\conf\extra\httpd-vhosts.conf" -InputObject $conf -Encoding ascii
        Write-Host "Virtual host $hostName has been created"
        Write-Host "Restart wamp server to effect changes"
    }
}

Обратите внимание - измените пути относительно вашей машины.

...