2009-04-18 30 views
21

Tôi đã thực hiện một chức năng Powershell ngay bây giờ và lưu nó vào một tập tin ps1. Tuy nhiên, khi tôi cố gắng thực hiện nó từ bên trong PowerShell, nó sẽ không chạy.Tệp Powershell ps1 "không được nhận dạng dưới dạng lệnh ghép ngắn, chức năng, chương trình có thể hoạt động hoặc tệp tập lệnh."

Tôi đã allready thay đổi các thiết lập để chạy mã unsigned bằng cách nhập lệnh này:

set-executionpolicy remotesigned 

Chức năng này là:

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

gì nó làm là tạo ra một textfile trong đó tất cả đường dẫn đến một tệp nhất định được liệt kê.
Tôi đã đặt nó trực tiếp dưới c: \ và đặt tên cho danh sách tệpAllPaths, giống như hàm.

Khi tôi nhập lệnh sau bên trong Powershell:

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

tôi nhận được một lỗi nói:

Thuật ngữ 'listAllPaths.ps1' không công nhận là một lệnh, chức năng, chương trình có thể hoạt động hoặc tệp tập lệnh. Xác minh cụm từ và thử lại.

Tôi đã thử một vài điều và tôi thực sự không biết cách làm việc này? Điều tôi mong đợi là một tệp sẽ được tạo trên đường dẫn đã cho, c: \ trong ví dụ này. Tệp đó có tên testingPDF.txt và nội dung được tạo ra này.

Ai đó có thể cho tôi biết những gì tôi quên ở đây.

Và không, Google không trả lời mọi thứ. Đã thử rằng một allready. Tôi sẽ không đến và hỏi nó ở đây nếu tôi đã không thử tất cả các công cụ tìm kiếm trực tuyến.

Trả lời

10

Đây là lỗi điển hình trên nhiều nền tảng mà đường dẫn môi trường của bạn không bao gồm thư mục hiện tại của bạn. vì vậy khi bạn thực thi kịch bản của bạn (hoặc lệnh hoặc chương trình, vv), môi trường thời gian chạy của bạn sẽ xuất hiện ở mọi nơi ngoại trừ thư mục hiện tại/làm việc của bạn.

Hãy thử

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

EDIT: Sau khi đọc ý kiến ​​của bạn, tôi sẽ đề nghị bạn thử này. Tôi đã không thực sự xác minh logic của kịch bản PS của bạn. Tôi chỉ đang cố gắng để kịch bản của bạn thực hiện trước tiên.

Thử chỉnh sửa tập lệnh của bạn như dưới đây và thực hiện như trên.

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

listAllPaths 
+0

Cảm ơn, nhưng nó không hoạt động. Tôi đã nhập lệnh đó và nó vừa nhảy qua nó. Không có báo cáo lỗi, chỉ cần một dòng mới trong PowerShell cho tôi để nhập lệnh trên. – KdgDev

+0

Ok, vậy điều đó có nghĩa là tập lệnh ps thực sự đang thực thi, nhưng không có đầu ra nào được trả về. Hãy thử đặt một số câu lệnh in để xác minh điều này. Bây giờ bạn có chắc là bạn không mắc phải một sai lầm tầm thường khác? Tôi thấy bạn đặt mã của bạn trong một hàm, nhưng bạn có thực sự gọi hàm trong kịch bản của bạn không? – Chaitan

+0

Gọi chức năng trong tập lệnh của tôi? Tôi không có kinh nghiệm với Powershell, những gì tôi đăng ở đây là nội dung chính xác của kịch bản của tôi, không nhiều, không kém. – KdgDev

7

tôi có thể tắt cơ sở ở đây, nhưng nó rằng kịch bản của bạn được xác định một chức năng, chứ không phải là thực hiện nó? Có lẽ bạn cần phải "nguồn" tập lệnh:

. .\listallpaths.ps1 

... để bây giờ chức năng "listallpaths" của bạn được xác định.

+0

vâng, bây giờ tôi có thể chỉ cần gõ chức năng và đưa ra các tham số. Tuy nhiên, giả sử tôi di chuyển rất nhiều và làm việc với các PC/máy tính xách tay khác nhau. Ngay cả khi tất cả chúng đều có quyền hạn, tôi phải xác định lại chức năng mỗi lần. Những gì tôi thực sự muốn làm trong trường hợp đó là chỉ cần gọi tập tin ps1 và cung cấp cho nó các đối số và có nó làm công việc. – KdgDev

+0

Matt - bạn đang đi đúng hướng .. Tôi vừa liệt kê sửa đổi cho tập lệnh để có được hành vi thời gian chạy mà WebDevHobo đang tìm kiếm. –

4

Nếu bạn thay thế "chức năng listallpaths" với param và thoát khỏi xung quanh {} như thế này ..

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

Bạn sẽ có một tập tin kịch bản mà bạn có thể gọi theo yêu cầu.

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

Như Matt ám chỉ, bằng cách tuyên bố hàm, khi bạn gọi tập lệnh, nó sẽ tạo hàm và sau đó thoát. Kịch bản PowerShell về cơ bản là một hàm được lưu trữ trong một tệp (không có dấu ngoặc xung quanh .. chúng được ngụ ý), nơi mà chính hàm đó sẽ được lưu trữ trong bộ nhớ.

+0

+1 - đó có vẻ là một cách sạch hơn nhiều để làm điều đó. –

Các vấn đề liên quan