2012-01-13 14 views
5

Mam skrypt wsadowy, który monituje użytkownika o pewne dane wejściowe, a następnie wyprowadza kilka plików, których używam w środowisku systemu AIX. Pliki te muszą być w formacie UNIX (który, jak sądzę, jest UTF8), ale szukam jakiegoś kierunku na NAJWYŻSZYM sposobie na zrobienie tego.Konwersja plików z systemu Windows do systemu UNIX za pomocą powłoki Powershell lub Batch

Nie chcę pobierać dodatkowych pakietów oprogramowania; Cygwin lub GnuWin32. Nie mam nic przeciwko kodowaniu tego, jeśli jest to możliwe, moje opcje kodowania to Batch, Powershell i VBS. Czy ktoś wie, jak to zrobić?

Czy można też utworzyć pliki za pomocą polecenia Batch i wywołać skrypt Powershell, aby je zreformować?

Pomysł polega na tym, że użytkownik zostanie poproszony o podanie pewnych informacji, a następnie wypisze standardowy plik, który jest zasadniczo szybką odpowiedzią w systemie AIX dla zadania. Używam początkowo Batcha, ponieważ nie wiedziałem, że wpadnę na ten problem, ale jestem skłonny do powtórzenia tego w Powershell. ponieważ znalazłem kod na innym forum, które może wykonać konwersję (poniżej).

% foreach($i in ls -name DIR/*.txt) { \ 
     get-content DIR/$i | \ 
     out-file -encoding utf8 -filepath DIR2/$i \ 
    } 

Szukasz jakiegoś kierunku lub jakiegoś wejścia na ten temat.

Odpowiedz

15

Nie można tego zrobić bez narzędzi zewnętrznych w plikach wsadowych.

Jeśli potrzebujesz tylko kodowania pliku, podany fragment powinien zadziałać. Jeśli chcesz przekonwertować pliki inline (zamiast pisać je w innym miejscu) można zrobić

Get-ChildItem *.txt | ForEach-Object { (Get-Content $_) | Out-File -Encoding UTF8 $_ } 

(nawiasy wokół Get-Content są ważne) Będzie to jednak zapisuje pliki w formacie UTF-8 z podpisem na początek (U + FEFF), którego niektóre narzędzia Uniksa nie akceptują (nawet jeśli jest to technicznie legalne, ale zniechęcone do używania).

Następnie pojawia się problem, że podziały linii różnią się między Windows i Unix. Unix używa tylko U + 000A (LF), podczas gdy Windows używa dwóch znaków: U + 000D U + 000A (CR + LF). Więc najlepiej przekonwertowałbyś także podziały wierszy. Ale to staje się trochę bardziej skomplikowane:

Get-ChildItem *.txt | ForEach-Object { 
    # get the contents and replace line breaks by U+000A 
    $contents = [IO.File]::ReadAllText($_) -replace "`r`n?", "`n" 
    # create UTF-8 encoding without signature 
    $utf8 = New-Object System.Text.UTF8Encoding $false 
    # write the text back 
    [IO.File]::WriteAllText($_, $contents, $utf8) 
} 
+0

Niezły Joey. Byłby miłym dodatkiem do poshcode.org (ConvertTo-UnixTextFile). –

+0

HM, byłem tam tylko w Skrypcie. Spróbuję przypomnieć sobie to później ;-) – Joey

+0

Fajnie, tak, to fajne małe repozytorium społeczności. Właśnie szukałem repo'ów PowerShell, ponieważ myślałem, że ekskluzywny kod jest jedyny dobry i niski wygląda na to, że centrum skryptów ma również [dobry] (http://gallery.technet.microsoft.com/scriptcenter). –

Powiązane problemy