Powershell + batch - batch nie czyta txt z powershella

0

Witam.

Chcę wykorzystać powershella do wyciągnięcia pewnych danych i zrzucenia ich do pliku. Następnie batchem odczytanie tych danych z pliku i dalsze wykorzystanie. Niestety batch nie widzi danych z txt utworzonego w powershellu i nie mam pojęcia dlaczego. Poniżej prosty przykład

ps1:

$data = "jakis tekst"
"$data">test1.txt

bat:

@echo off

Powershell -noprofile -executionpolicy bypass -file "%userprofile%\desktop\test\test.ps1"

for /f "tokens=*" %%a in (%userprofile%\desktop\test\test1.txt) do (
echo %%a
)

pause

Na pulpicie utworzyłem folder test i tam mam wszystkie pliki. Stąd taki adres w bat. Niestety taki rodzaj adresowania z ps1 zwraca mi błąd, więc jest samo >test1.txt. Ale tworzy go na tym samym poziomie, więc teoretycznie batch powinien dane zaczytać... a tak się nie dzieje. Nie ma natomiast problemu, jeśli wyremuję linię wywołującą ps1 i test1.txt utworzę z palca. Wtedy echo działa. Dlaczego tak się dzieje?

Chodzi o to, aby wszystko działało po odpaleniu batcha - wywołanie skryptu PS-a, który coś tam zrobi, zrzuci to do txt, a następnie ten sam bat, który wywołał skrypt - pobierze dane z pliku tekstowego i wyświetli je na ekranie.

pozdrawiam

0

sprawdź jakie jest kodowanie tekstu w pliku test1.txt.
spróbuj zmodyfikować zapisywanie zmiennej $data w pliku ps1
[IO.File]::WriteAllText("test1.txt", $data)

0

Próbowałem wcześniej z -encoding i nic to nie dawało. Teraz zadziałało. Wrzuciłem to w takiej formie.

$data | out-file -filepath test1.txt -encoding ASCII

Jednak to jest mocne uproszczenie pod testy. Wróciłem do skryptu, który jest mi potrzebny i nadal to nie działa. W sumie pokażę cały skrypt:

$Monitory = gwmi -Namespace root\wmi -Class wmiMonitorID 
$MonitorDetal = @() 
foreach ($Monitor in $Monitory) 
{
$MonitorTemp = New-Object PSObject 
$serial = $null
$name = $null
$Monitor.SerialNumberID | foreach {$serial += [char]$_} 
$Monitor.UserFriendlyName | foreach {$name += [char]$_} 

if ($serial -ne 0)
{
 $MonitorTemp = $serial 
 $MonitorTemp += $name 
 $MonitorDetal += $MonitorTemp 
}
} 

"$MonitorDetal" | out-file -filepath test1.txt -encoding ASCII

I właśnie efektu tego skryptu nie jestem w stanie zaczytać batchem. W takiej formie jak powyżej batch czyta serial z txt, ale już nie model monitora, który również w txt się znajduje.

0

Ktoś? Coś? :) Ja powershella ni w ząb niestety. Ale próbuję jak mogę. Skrypt uprościłem:

$Monitory = gwmi -Namespace root\wmi -Class wmiMonitorID  
foreach ($Monitor in $Monitory) 
{ 
$serial = $null
$Monitor.SerialNumberID | foreach {$serial += [char]$_} 

Remove-Item serial.txt
[System.IO.File]::AppendAllText("serial.txt", $Monitor.SerialNumberID, [System.Text.Encoding]::Unicode)
$content = [IO.File]::ReadAllText("serial.txt")
$content | Out-File -Encoding ASCII serial.txt
} 

Dziwnie. Działało tak, że przy: [System.IO.File]::AppendAllText("serial.txt", $Monitor.SerialNumberID, [System.Text.Encoding]::Unicode) byłem w stanie wyświetlić serial monitora poprzez batcha, ale w postaci kodów ASCII. Przy zmianie zmiennej na $serial znów batch niczego nie zwracał z pliku serial.txt. Uznałem więc, że problem jest z foreach {$serial += [char]$_} Ale teraz spróbowałem ponownie kopiując treść ps1 do innego pliku i... działa. I teraz kolejna ciekawostka (dla mnie):

$Monitory = gwmi -Namespace root\wmi -Class wmiMonitorID 
   foreach ($Monitor in $Monitory) 
   { 
        $serial = $null
        $Monitor.SerialNumberID | foreach {$serial += [char]$_} 
        $serial
             if ($serial -ne 0)
            {
                   Remove-Item serial.txt
                   [System.IO.File]::AppendAllText("serial.txt", $serial, [System.Text.Encoding]::Unicode)
                   $content = [IO.File]::ReadAllText("serial.txt")
                   $content | Out-File -Encoding ASCII serial.txt
            }
   } 

Ten kod powyżej działa. Poniżej już nie:

$Monitory = gwmi -Namespace root\wmi -Class wmiMonitorID 
   foreach ($Monitor in $Monitory) 
   { 
        $serial = $null
        $Monitor.SerialNumberID | foreach {$serial += [char]$_} 
        
             if ($serial -ne 0)
            {
                   Remove-Item serial.txt
                   [System.IO.File]::AppendAllText("serial.txt", $serial, [System.Text.Encoding]::Unicode)
                   $content = [IO.File]::ReadAllText("serial.txt")
                   $content | Out-File -Encoding ASCII serial.txt
            }
   } 

Skoro działa to w czym problem? W tym, że potrzebuję więcej danych niż tylko jeden serial. Jeśli do komputera podłączone są dwa monitory, to oba powinny się zalogować. Poza serialami - jeszcze z modelem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1