Создание виртуальных хостов для wampserver с помощью powershell
Я пытаюсь создать виртуальные хосты с помощью сценария 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$hostNameindex.php -type file
Out-File -FilePath D:wamp$hostNameindex.php -InputObject $indexText -Encoding UTF8
}
$hosts = Get-Content C:WindowsSystem32driversetchosts
$hosts = $hosts + "127.0.0.1 $hostName.localhost"
Out-File -FilePath C:WindowsSystem32driversetchosts -InputObject $hosts
$conf = Get-Content "C:Program Files (x86)wampbinapacheApache2.2.11confextrahttpd-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)wampbinapacheApache2.2.11confextrahttpd-vhosts.conf" -InputObject $conf -Encoding ascii
Write-Host "Restart wamp server to effect changes"
Кто-нибудь сумел заставить это работать надежно или я здесь на пустом месте? Я всегда могу использовать PHP вместо:)
Если кодировка не верна, то Apache отказывается запускаться под wampserver. Если я изменю кодировку в notepad++ на ANSI, то все работает нормально, но powershell не любит -encoding ANSI
.
2 ответа:
Использование опции
-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"; }
Я думаю, вы забыли закрыть свой тег 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" } }
Обратите внимание-измените пути относительно вашей машины.