Pytanie Plik PS1 Powershell "nie jest rozpoznawany jako cmdlet, funkcja, program operacyjny lub plik skryptu."


W tej chwili stworzyłem funkcję Powershell i zapisałem ją w pliku ps1. Jednak, gdy spróbuję wykonać go z poziomu powłoki, nie uruchomi się.

Zmieniłem już ustawienia dla uruchamiania niepodpisanego kodu, wprowadzając to polecenie:

set-executionpolicy remotesigned

Funkcja jest następująca:

Function listAllPaths([string]$fromFolder, [string]$filter, [string]$printfile){
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile
}

To, co robi, tworzy plik tekstowy, w którym wymieniona jest cała ścieżka do określonego pliku.
Umieściłem go bezpośrednio pod c: \ i nazwał listę plikówAllPaths, tak samo jak funkcja.

Kiedy wprowadzam następujące polecenie w Powershell:

PS> listAllPaths.ps1 c:\ *.pdf testingPDF.txt

Otrzymuję komunikat o błędzie:

Termin "listAllPaths.ps1" nie jest   rozpoznawane jako cmdlet, funkcja,   program operacyjny lub plik skryptu.   Zweryfikuj termin i spróbuj ponownie.

Próbowałem kilku rzeczy i szczerze mówiąc nie wiem, jak to uruchomić? Oczekuję, że plik zostanie utworzony na podanej ścieżce, c: \ w tym przykładzie. Ten plik o nazwie testingPDF.txt i zawartość, która go wygenerowała.

Czy ktoś może mi powiedzieć, o czym tu zapominam?

I nie, Google nie odpowiada na wszystko. Wypróbowałem to już wszystko. Nie przychodziłbym tutaj i nie pytałbym o to, gdybym nie wypróbował już wyszukiwarek internetowych.


21
2018-04-18 04:55


pochodzenie




Odpowiedzi:


Jest to typowy błąd występujący na wielu platformach, w których ścieżka środowiska nie zawiera bieżącego katalogu. więc gdy wykonasz skrypt (lub polecenie lub program itp.), twoje środowisko uruchomieniowe będzie się wyświetlało wszędzie poza twoim bieżącym / roboczym katalogiem.

Próbować

PS> .\listAllPaths.ps1 c:\ *.pdf testingPDF.txt

EDYTOWAĆ: Po przeczytaniu twoich komentarzy zasugeruję, abyś to wypróbował. Tak naprawdę nie zweryfikowałem logiki twojego skryptu PS. Po prostu próbuję najpierw wykonać twój skrypt do wykonania.

Spróbuj edytować swój skrypt jak poniżej i wykonaj powyższe czynności.

Function listAllPaths([string]$fromFolder, [string]$filter, [string]$printfile){
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile
}

listAllPaths

10
2018-04-18 05:00



Dzięki, ale to nie zadziałało. Wszedłem do tego polecenia i po prostu przeskoczyłem nad nim. Nie zgłoszono żadnego błędu, tylko nowa linia w powłoce dla mnie do wprowadzania poleceń. - KdgDev
Ok, więc oznacza to, że skrypt ps w rzeczywistości jest wykonywany, ale żadne dane wyjściowe nie są zwracane. Spróbuj wprowadzić pewne instrukcje drukowania, aby to sprawdzić. Czy jesteś pewien, że nie popełniłeś kolejnego banalnego błędu? Widzę, że umieściłeś swój kod w funkcji, ale czy faktycznie wywołujesz funkcję w swoim skrypcie? - Chaitan
Wzywając funkcję w moim skrypcie? Nie mam takiego doświadczenia z Powershell, to, co tutaj zamieściłem, to dokładna treść mojego scenariusza, nie więcej, nie mniej. - KdgDev
Dodałeś linię, która została zaczerpnięta, wykonana ponownie tak, jak pokazałeś wcześniej, ten sam wynik, po prostu przeskakuje nad nią ... - KdgDev
Próbowałem zemsty Matta. Mogę teraz użyć funkcji w powłoce, tak jakby była natywna. Chociaż nadal nie jest to zbyt użyteczne, jeśli dużo się przemieszczam, ponieważ będę musiał wielokrotnie definiować tę funkcję na każdym komputerze ... - KdgDev


Mógłbym być poza bazą, ale czy to twój scenariusz definiowanie funkcja, a nie jej wykonywanie? Być może potrzebujesz "źródła" skryptu:

. .\listallpaths.ps1

... więc teraz twoja funkcja "listallpaths" jest zdefiniowana.


7
2018-04-18 05:09



tak, mogę teraz po prostu wpisać funkcję i podać parametry. Mimo to, przypuśćmy, że dużo się przemieszczam i pracuję z różnymi komputerami PC / laptopami. Nawet jeśli wszyscy mają moc, musiałbym przedefiniować funkcję za każdym razem. To, co naprawdę chcę zrobić w tym przypadku, to po prostu wywołać plik ps1 i podać mu argumenty i zlecić wykonanie tej pracy. - KdgDev
Matt - jesteś na dobrej drodze ... Właśnie podałem modyfikację skryptu, aby uzyskać działanie środowiska wykonawczego, którego szukał WebDevHobo. - Steven Murawski


Jeśli zamienisz "function listallpaths" na param i pozbędziesz się otaczającego {} jak to ...

param([string]$fromFolder, [string]$filter, [string]$printfile)
Get-ChildItem -Path $fromFolder -Include $filter -Recurse -Force -Name > $printfile

Będziesz mieć plik skryptowy, który możesz wywołać w razie potrzeby.

PS> .\listAllPaths.ps1 c:\ *.pdf testingPDF.txt

Jak wspominał Matt, deklarując funkcję, gdy wywołasz skrypt, utworzy on funkcję, a następnie zakończy działanie. Skrypt PowerShell to w zasadzie funkcja zapisana w pliku (bez otaczających nawiasów klamrowych .. są one implikowane), gdzie sama funkcja będzie przechowywana w pamięci.


4
2018-04-18 13:49



+1 - to wydaje się być o wiele czystszym sposobem na zrobienie tego. - Matt Hamilton