Làm thế nào để bạn gọi một tập lệnh powershell trong python?

Tạo tập lệnh tự động để bạn có thể chạy trên nhiều máy tính mà không cần tương tác của người dùng.

Ghi chú. Để chạy tập lệnh tự động, bạn phải cài đặt phiên bản chính mới nhất của khung có liên quan trên.

Quan trọng. Để sử dụng tính năng này, người dùng phải được xác thực bằng xác thực không tin cậy, phục vụ cho tính bảo mật của phiên.

Xác thực chỉ được yêu cầu một lần khi bạn chạy bước Thực thi từ xa

    1. Trên trang Thực hiện từ xa, chọn Tạo công việc mới

      Kết quả. Trang Tạo công việc được hiển thị

    2. Chọn nền tảng mà bạn muốn chạy các bước tự động hóa
    3. Thêm một trong các bước sau vào danh sách bên trái
      • Thực thi PowerShell
      • thực thi JavaScript
      • Thực thi Python
      • Thực thi tập lệnh Shell [chỉ khả dụng trên máy Mac]
    4. Dán tập lệnh của bạn vào trường. Bạn cũng có thể chọn tệp để tải lên mà máy tính từ xa có thể tải xuống.

      Ghi chú. Bạn có thể tham khảo [các] tệp từ tập lệnh. Bạn có thể tải lên tối đa ba tệp cho mỗi công việc với kích thước tối đa là 1GB cho mỗi tệp. Bất kỳ tập tin có thể được sử dụng.

    5. Bấm tiếp
    6. Từ danh sách Máy tính, xác định máy tính hoặc một nhóm máy tính that will receive the script.

      Bạn có thể sắp xếp các thiết bị của mình bằng cách chọn một tùy chọn nhóm từ đầu danh sách

    7. Bấm tiếp
    8. Đặt tên công việc theo cách dễ nhớ sau này
    9. Nhấp vào Chạy

      Ghi chú. Thời gian chờ đặt trước liên quan đến cả công việc và.

      Thời gian chờ cho mỗi lần được đặt thành hai giờ, nghĩa là GoTo Resolve đợi hai giờ để tập lệnh hoàn tất trên máy tính từ xa. Khi tập lệnh kết thúc, GoTo Resolve bắt đầu bước tiếp theo và đợi thêm hai giờ nữa để bước đó kết thúc. Nếu một bước không hoàn thành trên máy tính từ xa sau hai giờ, thì bước đó sẽ hết thời gian chờ và toàn bộ công việc không thành công.

Kết quả

Ghi chú

Khi bạn tham chiếu một tệp từ tập lệnh, bạn chỉ cần nhập tên của nó. Sau khi kết thúc, tệp sẽ bị xóa khỏi máy tính từ xa , trừ khi tệp được sao chép ở một nơi khác cùng với tập lệnh.

Ví dụ.

Bạn tải lên 'a. txt' cho công việc và bạn muốn sao chép nó vào một thư mục [còn được gọi là phân phối tệp]. Kịch bản của bạn sẽ giống như thế này.

Copy-Item a.txt C:\Destination

Gần đây, tôi đang làm việc trên một số trường hợp sử dụng để sửa đổi các báo cáo mỏng Power BI theo chương trình bằng pbi-tools và Python. Một trường hợp sử dụng ví dụ gần đây là đặt tất cả độ rộng cột trong bảng và ma trận thành cùng một kích thước. Để dịch ngược các báo cáo sang mã nguồn của họ, cho đến bây giờ, tôi chủ yếu sử dụng các công cụ pbi từ PowerShell, chẳng hạn, bằng cách tự động hóa nó bất cứ khi nào tôi lưu một. pbix bằng quy trình Power Automate

Tôi tự hỏi liệu tôi có thể làm điều này thuận tiện hơn cho công việc của python hay không bằng cách thực thi các công cụ pbi trong tập lệnh python, để xử lý ngay các kết quả đầu ra và sau đó biên dịch lại tệp sau khi điều chỉnh. Hơn nữa, các tập lệnh yêu cầu nhiều thao tác nhập thủ công, vì vậy tôi đã thử nghiệm GUI do python tạo để đơn giản hóa việc sử dụng. Điều này không chỉ giúp tôi thuận tiện hơn mà còn là một bài tập thú vị khi suy nghĩ về thiết kế ứng dụng & trải nghiệm người dùng ngay từ đầu, thay vì trong ngữ cảnh cố định của báo cáo Power BI

HƯỚNG DẪN

BẠN CẦN GÌ

  1. Trăn 3. x [không phải Colab trừ khi bạn đang sử dụng thời gian chạy cục bộ của mình]

  2. cài đặt pbi-tools &

CHẠY POWERSHELL TỪ PYTHON [I. E. CÔNG CỤ PBI]

Nói rõ hơn - Tôi không phải là chuyên gia về Python hay PowerShell. Tôi đã học cả hai để giúp tôi thực hiện một số dự án - chủ yếu là các dự án theo sở thích. Mối quan tâm của tôi là liệu tôi có thể thực thi lệnh PowerShell từ bên trong python hay không và tiếp tục sử dụng kết quả xuôi dòng

Làm điều này khá dễ dàng; . Nếu bạn thực thi quy trình con. run[] bạn chuyển một chuỗi dưới dạng đối số chứa

  1. Vị trí cài đặt PowerShell [powershell]

  2. Các. tập lệnh ps hoặc chức năng bạn muốn gọi [công cụ pbi trong trường hợp của tôi]

  3. Bất kỳ đối số nào cho [2] [trích xuất pbixpath và -extractFolder outpath trong trường hợp của tôi]

powershell = r'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
pbixpath = r'C:\Users\Klonk\Desktop\column-width_thin-report.pbix'
outpath = r'C:\Users\Klonk\Desktop\pbi-tools-output\'

subprocess.run[f'{powershell} pbi-tools extract {pbixpath} -extractFolder {outpath}']

Tiếp tục với kết quả xuôi dòng cũng đơn giản bằng cách sử dụng đối số capture_output=True. Lưu kết quả vào một biến cũng có nghĩa là bạn có thể kiểm tra mã trả về, để xem quá trình có hoàn tất thành công hay không, như trong ví dụ dưới đây

pbitools = subprocess.run[f'{powershell} pbi-tools extract {pbixpath}']

if pbitools.returncode == 0:
    print['Success 😁']
else:
    print['Fail 😥']

Đó là khá nhiều - lưu ý rằng nếu bạn đang sử dụng quy trình con, có một số

TẠO GUI TRONG PYTHON - TKINTER

Bây giờ chúng ta có thể thực thi các công cụ pbi từ python để dịch ngược một. báo cáo pbix. Mặc dù đây đã là thứ tôi cần, nhưng nó hơi bất tiện vì đường dẫn cần được chỉ định thủ công. Cách duy nhất để làm cho nó năng động hơn là tìm kiếm. pbix trong một thư mục nhất định - điều mà tôi không muốn làm - hoặc tạo giao diện người dùng đồ họa [GUI] cơ bản để tôi có thể chọn. tập tin pbix, bản thân tôi

Tôi chưa bao giờ thử tạo GUI trước đây, vì vậy đây có vẻ là một cơ hội thú vị để thử. Tạo GUI không chỉ là một thứ gì đó thú vị cho trường hợp sử dụng cụ thể này;

Có một số cách khác nhau để tạo GUI trong python; . tkinter hoạt động theo cách tương đối đơn giản; . Việc tạo các tiện ích này liên quan đến việc xác định một số chức năng có thể được gọi và tham chiếu, trong đó các chức năng có thể sửa đổi các tiện ích khác theo điều kiện. Một ví dụ về điều này có thể là nút 'OK' bị tắt cho đến khi người dùng thực hiện hành động, khi đó, tiện ích nút 'OK' được thay đổi thành trạng thái đã bật. Với các tham chiếu chéo và phụ thuộc này, thật dễ dàng để tưởng tượng rằng nó có thể nhanh chóng trở nên phức tạp [như với bất kỳ thiết kế giao diện người dùng nào]

 

BƯỚC 1. Khởi tạo cửa sổ.
Sau khi nhập các gói, bước đầu tiên là khởi tạo và định dạng cửa sổ; .

from tkinter import * 
from tkinter import ttk
from tkinter import filedialog

class GUI:

    def __init__[self]:

        # Initialize the root widget
        self.root = Tk[]    
        # Title of the window
        self.root.title["Python pbi-tools"]
        # Window colour, size & cursor 
        self.root.configure[bg='#f3f0ea', width = 600, height = 150, cursor="hand2"]
        # Whether the window is x, y resizable [False]
        self.root.resizable[False, False]

        # Uses display; responds to input until termination
        self.root.mainloop[]

GUI[]

Kết quả. Một cửa sổ trống xuất hiện trên màn hình, được định dạng như chúng tôi đã chỉ định

 

BƯỚC 2. Thêm một số tiện ích nhãn văn bản.
Tiếp theo, chúng ta có thể thêm một số tiêu đề và nhãn văn bản đơn giản.
Với giao diện người dùng này, tôi chỉ muốn người dùng [tôi] chọn một. pbix và đường dẫn đầu ra.

Lưu ý rằng hành vi mặc định là không để nhãn văn bản trong suốt; .

from tkinter import * 
from tkinter import ttk
from tkinter import filedialog

class GUI:

    def __init__[self]:

        # Initialize the root widget
        self.root = Tk[]    
        # Title of the window
        self.root.title["Python pbi-tools"]
        # Window colour, size & cursor 
        self.root.configure[bg='#f3f0ea', width = 600, height = 150, cursor="hand2"]
        # Whether the window is x, y resizable [False]
        self.root.resizable[False, False]

        # Title for main window
        self.message = Label[self.root,
                                text = "Select a .pbix file to decompile it with pbi-tools",
                                font = ["Segoe UI", 14, 'bold'],
                                fg = '#3d4244',
                                justify = CENTER,
                                bg='#f3f0ea']
        self.message.place[relheight = 0.15, relx = 0.14, rely = 0.07]

        # Label for the filepath row header
        self.LabelInputPath = Label[self.root,
                                        text = "Input .pbix: ", 
                                        bg='#f3f0ea']
        self.LabelInputPath.place[relheight = 0.2, relx = 0.117, rely = 0.3]       

        # Label for the filepath text
        self.LabelSelectedFilePath = Label[self.root,
                                            text = "Select a .pbix file to decompile.",
                                            bg='#f3f0ea']
        self.LabelSelectedFilePath.place[relheight = 0.2, relx = 0.23, rely = 0.3] 

        # Label for the output path row header
        self.LabelOutputPath = Label[self.root,
                                            text = "Output Path: ",
                                            bg='#f3f0ea']
        self.LabelOutputPath.place[relheight = 0.2, relx = 0.1, rely = 0.51]       

        # Label for the output path text
        self.LabelSelectedOutputPath = Label[self.root,
                                            text = "Select an output path.",
                                            bg='#f3f0ea']
        self.LabelSelectedOutputPath.place[relheight = 0.2, relx = 0.228, rely = 0.51]


        # Uses display; responds to input until termination
        self.root.mainloop[]
GUI[]

Càng xa càng tốt. Cú pháp đơn giản và kết quả là những gì chúng ta mong đợi

Kết quả. Cửa sổ hiện có một số hướng dẫn và tiêu đề

 

BƯỚC 3. Thêm các nút.
Tiếp theo là các tiện ích nút. Đây là những thứ khá dễ dàng để thêm vào, nhưng việc thêm chức năng sẽ mất thêm một số công việc; .

from tkinter import * 
from tkinter import ttk
from tkinter import filedialog

class GUI:

    def __init__[self]:

#####################
# STEP 1
#####################

        # Initialize the root widget
        self.root = Tk[]    
        # Title of the window
        self.root.title["Python pbi-tools"]
        # Window colour, size & cursor 
        self.root.configure[bg='#f3f0ea', width = 600, height = 150, cursor="hand2"]
        # Whether the window is x, y resizable [False]
        self.root.resizable[False, False]

#####################
# STEP 2
#####################

        # Title for main window
        self.message = Label[self.root,
                                text = "Select a .pbix file to decompile it with pbi-tools",
                                font = ["Segoe UI", 14, 'bold'],
                                fg = '#3d4244',
                                justify = CENTER,
                                bg='#f3f0ea']
        self.message.place[relheight = 0.15, relx = 0.14, rely = 0.07]

        # Label for the filepath row header
        self.LabelInputPath = Label[self.root,
                                        text = "Input .pbix: ", 
                                        bg='#f3f0ea']
        self.LabelInputPath.place[relheight = 0.2, relx = 0.117, rely = 0.3]       

        # Label for the filepath text
        self.LabelSelectedFilePath = Label[self.root,
                                            text = "Select a .pbix file to decompile.",
                                            bg='#f3f0ea']
        self.LabelSelectedFilePath.place[relheight = 0.2, relx = 0.23, rely = 0.3] 

        # Label for the output path row header
        self.LabelOutputPath = Label[self.root,
                                            text = "Output Path: ",
                                            bg='#f3f0ea']
        self.LabelOutputPath.place[relheight = 0.2, relx = 0.1, rely = 0.51]       

        # Label for the output path text
        self.LabelSelectedOutputPath = Label[self.root,
                                            text = "Select an output path.",
                                            bg='#f3f0ea']
        self.LabelSelectedOutputPath.place[relheight = 0.2, relx = 0.228, rely = 0.51]

#####################
# STEP 3
#####################

        # Input File Browse button
        self.button_input_browse = ttk.Button[self.root,
                                                text = "Browse..."]
        self.button_input_browse.place[relx = 0.53, rely = 0.315]

        # Output Path Browse button
        self.button_output_browse = ttk.Button[self.root,
                                                text = "Browse..."]
        self.button_output_browse.place[relx = 0.53, rely = 0.52]

        # Cancel button
        self.browse_button = ttk.Button[self.root,      
                                            text = "Cancel"]    
        self.browse_button.place[relx = 0.73, rely = 0.8]

        # Add OK button
        self.button_OK = ttk.Button[self.root,
                                        text = "OK"]
        self.button_OK.place[relx = 0.865, rely = 0.8]

#####################
# Uses display; responds to input until termination
#####################

        self.root.mainloop[]

GUI[]

Kết quả. Các nút, nhưng chúng chưa làm gì cả

 

BƯỚC 4. Xác định chức năng cho các nút lệnh.
Đây là nơi phức tạp 'tăng tốc'. Bây giờ chúng ta nên nói với tkinter những gì chúng ta muốn các nút làm. Cách rõ ràng nhất để thực hiện việc này là xác định một số chức năng chỉ định các lệnh của nút. Điều này được thực hiện bằng cách chỉ cần sửa đổi mã ở trên để bao gồm cho mỗi nút một đối số bổ sung, trong đó command = function[] [các chức năng chúng tôi sẽ xác định, bên dưới].

Chúng tôi có 4 nút và chúng tôi muốn mỗi nút làm một việc khác nhau

  • Đầu vào. nút pbix Duyệt…. Mở hộp thoại tệp để chọn một. pbix [và chỉ. tệp pbix]. Đường dẫn này sẽ được sử dụng như một biến chuỗi khi chúng ta gọi pbi-tools với quy trình con. chạy[], sau.

    BƯỚC 5. Sửa đổi các vật dụng hiện có.
    Chúng ta nên ẩn nút này sau khi sử dụng để nút này không được sử dụng lại. Để làm điều đó, chúng tôi sử dụng. place_forget[].
    Hơn nữa, chúng ta nên sửa đổi tiện ích FilePath hiện có mà chúng ta đã thêm [tiện ích này ban đầu cung cấp một số hướng dẫn] cho đường dẫn đã chọn. Điều này chỉ được thực hiện bằng cách cập nhật. cấu hình[]

 

#####################
# Input .pbix browse button
#####################

    def get_file_path[self]:
        # Set global file_path var
        global file_path
        # Open file dialog accepting only .pbix files; path will be the file_path var
        file_path= filedialog.askopenfilename[title = "Select A File", filetypes = [["pbix files", "*.pbix"]]]

    #####################
    # Step 5: Modify existing widgets
    #####################

        # Hide button after push
        self.button_input_browse.place_forget[]
        # Update text label with file path
        self.LabelSelectedFilePath.config[text=file_path, bg='#f3f0ea']
        # Update 'OK' button state once the file dialog is done
        self.button_OK["state"] = NORMAL

  • Đường dẫn xuất nút Duyệt…. Chỉ định đường dẫn đầu ra. Đường dẫn đầu ra này cũng sẽ được sử dụng làm đối số biến chuỗi cho pbi-tools. Nó phải bao gồm một hậu tố mới ‘/pbi-tools-output’ để đảm bảo rằng không có thư mục hiện có nào bị ảnh hưởng bởi -extractFolder.

    BƯỚC 5. Sửa đổi các vật dụng hiện có.
    Giống như nút Nhập liệu, chúng ta nên ẩn nút này sau khi sử dụng để không sử dụng lại. Để làm điều đó, chúng tôi sử dụng. place_forget[].

 

#####################
# Output path browse button
#####################

    def get_output_path[self]:
        # Set global file_path var
        global output_path
        # Open and return file path as file_path var
        output_path = filedialog.askdirectory[title = "Select An Output Destination"] + f'/pbi-tools-output'

    #####################
    # Step 5: Modify existing widgets
    #####################

        # Hide button after push
        self.button_output_browse.place_forget[]
        # Update text label with file path
        self.LabelSelectedOutputPath.config[text=output_path, bg='#f3f0ea']

  • Nút Hủy. Thoát GUI và kết thúc chương trình mà không cần làm gì khác.

 

________số 8

  • Nút OK. Xác nhận đầu vào. pbix đã chọn và tiếp tục tập lệnh.

    BƯỚC 5. Sửa đổi các vật dụng hiện có.
    Ở đây chúng ta cần sửa đổi nút ‘OK’ theo điều kiện. Chúng tôi không muốn có thể chọn 'OK' và tiếp tục cho đến khi đường dẫn tệp đến. pbix được chỉ định. Để làm điều đó, chúng tôi thêm vào chức năng init đầu tiên bên dưới, chức năng này sẽ đặt trạng thái mặc định của nút 'OK'.
    chính mình. button_OK["state"] = ĐÃ TẮT

    Sau đó, chúng tôi có thể thay đổi điều này trong nút 'Đầu vào', thay đổi trạng thái sau khi hoàn tất hộp thoại tệp.
    chính mình. button_OK["state"] = BÌNH THƯỜNG

 

#####################
# OK button
#####################

    def close_window[self]:
        # Ends the tkinter window and continues the script; doesn't exit[]
        self.root.destroy[] 

 

 

Kết quả. Trước khi chọn một. pbix và đường dẫn đầu ra

Kết quả. Sau khi chọn một. pbix và đường dẫn đầu ra

 

 

BƯỚC 6. Sử dụng các biến toàn cầu xuôi dòng trong phần còn lại của tập lệnh.
Kết hợp với quy trình con. run, ở trên, chúng ta có thể thêm một số định dạng và xử lý lỗi để có được đầu ra đẹp, trong đó GUI tkinter của chúng ta có thể chạy thành công các công cụ pbi và dịch ngược mã. pbix. Cuối cùng, tôi cũng đã thêm một số mã bổ sung để chỉ định rằng vị trí cửa sổ mặc định ở giữa màn hình và đó luôn là cửa sổ trên cùng.

Đầu ra cuối cùng;

Bây giờ tôi có thể chạy các công cụ pbi từ bên trong python và sử dụng đầu ra cho các hành động lập trình xuôi dòng khác

KẾT LUẬN

  • Có thể chạy PowerShell từ bên trong python bằng quy trình con. run[] và chỉ định powershell. đường dẫn exe

  • Bạn có thể sử dụng đầu ra từ tập lệnh PowerShell hoặc chương trình xuôi dòng trong python

  • Tạo GUI bằng tkinter trong Python dễ dàng một cách đáng ngạc nhiên, nhưng các yếu tố phụ thuộc phải được quản lý

  • Có rất nhiều điều kiện để kiểm tra khi tạo GUI mà bạn coi là đương nhiên khi sử dụng các công cụ mã thấp hoặc không mã, chẳng hạn như khi thiết kế báo cáo trong Power BI

    Tôi có thể chạy tập lệnh PowerShell từ dòng lệnh không?

    Chạy tập lệnh PowerShell từ Dấu nhắc Lệnh . PowerShell -Tệp C. \TEMP\MyNotepadScript. ps1. PowerShell -Tệp C. \TEMP\MyNotepadScript. you'll need to execute it by calling the PowerShell process with the -File parameter, as shown below: PowerShell -File C:\TEMP\MyNotepadScript. ps1. PowerShell -File C:\TEMP\MyNotepadScript.

    Có thể sử dụng Python thay cho PowerShell không?

    Trong Windows, một số cấu hình chỉ có thể thực hiện được trong PowerShell. Tuy nhiên, PowerShell không phải là ngôn ngữ kịch bản duy nhất – Python cũng là một tùy chọn phổ biến . Trong bài viết này, chúng tôi so sánh hai ngôn ngữ và kiểm tra các tình huống sử dụng có thể xảy ra trên Windows, Linux và Mac OS. Chúng ta sẽ bắt đầu với Python.

Chủ Đề