簡體   English   中英

PowerShell 在從命令行或批處理腳本觸發時不加載程序集以供使用

[英]PowerShell not loading assemblies for use when fired from command line or batch script

如問題所述,從命令行或批處理文件運行時,在 Powershell 中發現了一個非常奇怪的錯誤。

PowerShell 命令(如Add-Type -AssemblyName -AssemblyName)的預期行為是加載指定為該命令參數的程序集,然后我們應該能夠將該程序集用於我們運行的下一個命令,即使我們在批處理腳本或命令中執行此過程迅速的。

但是當我們在批處理文件或命令提示符下運行它時,這不起作用:

@echo off && SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
net file 1>NUL 2>NUL
if not '%errorlevel%' == '0' (
    pushd "%~dp0" & powershell Start-Process -FilePath "%0" -ArgumentList "%cd%" -verb runas >NUL 2>&1 & popd
    exit /b
)
cd /d "%1" && set "ScptDir=%1"

PowerShell "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Clipboard]::Clear()"
endlocal && exit

或者

@echo off && setlocal
@pushd %~dp0 & fltmc | find "." && (powershell start '%~f0' ' %*' -verb runas 2>nul && exit /b)
whoami
:: PowerShell "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Clipboard]::Clear()"
type NUL | clip.exe
popd && pause && endlocal && exit

這些並沒有清除 Windows 系統剪貼板,這與任何人的預期相反。 Also tried PowerShell "& {Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Clipboard]::Clear()}" , but no change.

對此進行任何更改或解決方法以使其正常工作?

  • Windows 剪貼板是用戶特定的功能。

    • 給定剪貼板實例與給定用戶的操作系統 session (窗口站,通常是交互式登錄用戶的桌面)相關聯。

    • 在給定用戶的操作系統 session 中啟動的所有本地執行進程共享相同的剪貼板 - 即使這些進程冒充其他用戶。 (相比之下,明智地,不同用戶的操作系統會話的剪貼板是不同的。)

  • 因此,對於用戶的給定操作系統 session,常規和提升(以管理員身份運行)進程使用相同的剪貼板。

    • 提升是否在當前用戶帳戶的上下文中發生取決於該用戶是否是具有管理權限的組的成員。 如果是這樣,則僅顯示是/否UAC對話框,並且如果確認,提升的進程將使用相同的用戶身份運行。

    • 但是,如上所述,即使您使用不同的憑據進行提升,生成的過程仍然會看到相同的剪貼板。

  • 設置或清除剪貼板不需要提升。

    • Note that clearing the clipboard with [System.Windows.Forms.Clipboard]::Clear() and equivalent methods has no impact on the opt-in clipboard history feature available since Windows 10. That is, it clears only the clipboard's current content,不是已經存儲在歷史記錄中的先前復制的條目。

  • 因此,您的批處理文件應該可以工作,並且在我嘗試時也可以。

  • 如果您只是想從批處理文件中清除當前用戶的剪貼板(無論是否提升),請使用以下命令(注意:從技術上講,這不會清除剪貼板,而是將其設置為空字符串):

     type NUL | clip.exe
    • From PowerShell , a simpler alternative to [System.Windows.Forms.Clipboard]::Clear() is to use Set-Clipboard $null , but note that in PowerShell (Core) 7+ , which supports only copying text to the clipboard,這也像type NUL | clip.exe 批處理文件中的type NUL | clip.exe - 將空字符串復制到剪貼板而不是清除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM