- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个 c# cmdlet,它将文件从一个位置复制到另一个位置(类似于 rsync)。它甚至支持 ToSession 和 FromSession。
我希望它与使用文件系统提供程序的 PSDrives 一起工作,但它目前从 System.IO.File.GetAttributes("psdrive:\path") 抛出错误
我真的很想在 PSDrive 上使用来自 System.IO 的调用。
像 copy-item 这样的东西是如何做到这一点的?
我已经执行了从 C# 访问 PSDrives 的搜索,但没有返回任何结果。
这相当于我的代码
new-psdrive -name mydrive -psprovider filesystem -root \\aserver\ashare -Credential domain\user
$attributes=[system.io.file]::GetAttributes("mydrive:\path\")
返回
Exception calling "GetAttributes" with "1" argument(s): "The given path's format is not supported."
最佳答案
.NET 对 PowerShell 驱动器一无所知(通常也有不同的工作目录),因此转换为 本地文件系统路径是必需的:
在 PowerShell 代码中:
使用Convert-Path
将基于 PowerShell 驱动器的路径转换为 .NET 类型理解的 native 文件系统路径:
$attributes=[System.IO.File]::GetAttributes((Convert-Path "mydrive:\path\"))
默认情况下(使用位置参数)和 -Path
,Convert-Path
执行通配符解析;要抑制后者,请使用 -LiteralPath
参数。
警告:Convert-Path
仅适用于现有 路径。取消该限制是 GitHub issue #2993 中功能请求的主题.
在 C# 代码中:
在PSCmdlet
-派生的 cmdlet:
使用 GetUnresolvedProviderPathFromPSPath()
将基于 PS 驱动器的路径转换为基于 native 驱动器的路径[1] 未解决,这意味着,除了转换驱动器部分:
使用 GetResolvedProviderPathFromPSPath()
将基于 PS 驱动器的路径解析为基于 native 驱动器的路径,这意味着除了翻译驱动器部分之外:
使用 CurrentProviderLocation()
使用提供程序 ID “FileSystem”
获取当前文件系统位置路径作为 System.Management.Automation.PathInfo
实例的方法;该实例的 .Path
属性和 .ToString()
方法返回路径的 PS 形式;使用 .ProviderPath
属性获取 native 表示。
这是一个简单的临时编译的 cmdlet,它可以使用这两种方法:
# Compiles a Get-NativePath cmdlet and adds it to the session.
Add-Type @'
using System;
using System.Management.Automation;
[Cmdlet("Get", "NativePath")]
public class GetNativePathCommand : PSCmdlet {
[Parameter(Mandatory=true,Position=0)]
public string PSPath { get; set; }
protected override void ProcessRecord() {
WriteObject("Current directory:");
WriteObject(" PS form: " + CurrentProviderLocation("FileSystem"));
WriteObject(" Native form: " + CurrentProviderLocation("FileSystem").ProviderPath);
//
WriteObject("Path argument in native form:");
WriteObject(" Unresolved:");
WriteObject(" " + GetUnresolvedProviderPathFromPSPath(PSPath));
//
WriteObject(" Resolved:");
ProviderInfo pi;
foreach (var p in GetResolvedProviderPathFromPSPath(PSPath, out pi))
{
WriteObject(" " + p);
}
}
}
'@ -PassThru | % Assembly | Import-Module
您可以按如下方式进行测试:
# Create a foo: drive whose root is the current directory.
$null = New-PSDrive foo filesystem .
# Change to foo:
Push-Location foo:\
# Pass a wildcard path based on the new drive to the cmdlet
# and have it translated to a native path, both unresolved and resolved;
# also print the current directory, both in PS form and in native form.
Get-NativePath foo:\*.txt
如果您当前的目录是 C:\Temp
并且它恰好包含文本文件 a.txt
和 b.txt
,那么您将看到以下输出:
Current directory:
PS form: foo:\
Native form: C:\Temp\
Path argument in native form:
Unresolved:
C:\Temp\*.txt
Resolved:
C:\Temp\a.txt
C:\Temp\b.txt
[1] 如果在输入路径中引用的 PS 驱动器(使用 New-PSDrive
创建)是根据 UNC 路径定义的,则结果 native 路径也将是 UNC 路径。
关于c# - 如何从 System.IO.File 调用访问 PSDrive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721850/
我正在尝试使用 Get-PSDrive 将磁盘使用的所有驱动器号放入一个返回每个字母的字符串中(有效) 我在使用 $ISODeviceLetter 变量时遇到问题,无法将其用作在所有驱动器中搜索 .I
我假设在函数中创建一个新的 PS-Drive 会使该驱动器只能在该函数中访问。 如何通过从该函数可访问的 MAIN 调用函数来创建 PS 驱动器? $temproraryPSDriveName =
我使用 Powershell > 4 在我的计算机上创建和删除驱动器。我将它们本地连接到文件夹或远程驱动器: New-PSDrive -Name L -PSProvider FileSystem -R
我有一个很长的路径名,我为它创建了一个 PS-Drive new-psdrive -name blah -psprovider filesystem -root c:/foo/bar/bizz/baz
我在使用New-PSDrive连接到远程服务器时遇到问题。远程服务器是基于Windows的,并且只有userA有权写。 如此说来,以下代码将引发“访问被拒绝”错误: Access to the pat
我在删除脚本中用户的特定驱动器时遇到问题。我无法使用 NET USE,因为它已被代替我的安全人员删除。Remove-PSDrive -Name X 仅为 PS shell 而不是用户的资源管理器删除它
我在使用 powershell 时遇到了一个小问题,这可能非常简单...如果我从控制台运行命令而不是从 .ps1 文件运行命令,我会得到不同的行为。命令; New-PSDrive -PSProvide
我有一个自动加载的模块,用于放置我的日常函数和变量。 希望当我启动 PowerShell session 时 PSDrive 总是在这里,在 MyPSModule 的一开始我调用: $script_d
我正在递归一个深层文件夹结构,以便像这样检索所有文件夹路径: $subFolders = Get-ChildItem $rootFolder -Recurse -Directory -ErrorVa
我正在使用 powershell 在几台计算机上映射一些网络驱动器。大多数情况下它运行良好,但现在它在我以前从未尝试过的计算机上出现故障。 我正在做 New-PSDrive -Persist -Na
有没有办法使用非系统安全字符串密码创建 New-PSDrive? 如果密码是“FooBoo”,我想按原样使用它... 最佳答案 只需使用旧的 net use 命令 PS>net use z: \\se
我正在运行一个基于 powershell 的多线程应用程序,其中每个线程(.net 任务)都需要使用不同的凭据将一堆文件从一台机器复制到另一台机器。这是在每个 .net 任务中运行的脚本 New-PS
我正在尝试获取网络驱动器的 RemoteAdress。我是这样做的: Get-PSDrive -name K -PSProvider FileSystem 我不是在开玩笑,这个命令在 ISE 和终端中
我昨天才发现 PowerShell,我喜欢它。 我正在尝试列出所有有效挂载的分区,这样我就可以将它们设为变量并在它们上运行chkdsk。问题是我不想检测机器上的备份分区。我用来编写和测试此脚本的计算机
我正在尝试在 PowerShell 2.0 中映射驱动器并收到此错误? New-PSDrive –Name ftp –PSProvider FileSystem –Root “\\server\fol
我已经尝试使用 $function:foo 值和 get-item function:foo。所有尝试都成功地修改了临时函数对象,但在重新分配给存储函数时缺少附加属性(通过 $function:foo
我无法 catch DriveNotFoundException由 Get-PSDrive 生成在以下示例中: try { # Assumes no Q:\ drive connected.
我试图在 Windows 2008 服务器上查找不是“C、E、L、S、T、W”的每个驱动器号。谁能告诉我我逻辑上的错误或我该怎么做? [char[]]”CELSTW” | Where-Object {
我有一个我编写的日志记录模块,它使用 Out-File -Append 将各种行写入文件。我正在为 SCCM 编写一些脚本和模块。大多数 SCCM 功能/命令不允许您通过参数定位特定的提供者/位置。
我正在编写一个 c# cmdlet,它将文件从一个位置复制到另一个位置(类似于 rsync)。它甚至支持 ToSession 和 FromSession。 我希望它与使用文件系统提供程序的 PSDri
我是一名优秀的程序员,十分优秀!