相关疑难解决方法(0)

重命名项:Powershell 中的源路径和目标路径必须不同错误

我正在使用 Powershell 并尝试返回目录的子项(该子项恰好是子目录),然后使用 cmdletRename-Item将子目录名称重命名为其他名称。

我觉得下面的代码应该有效:

Get-ChildItem "C:\Users\Admin\Desktop\mydirectory\subdirectory" | Rename-Item -NewName {$_.Name -replace 'test'} 
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

Rename-Item : Source and destination path must be different.

我在这里缺少什么?提前致谢!

powershell get-childitem rename-item-cmdlet powershell-cmdlet

6
推荐指数
1
解决办法
6510
查看次数

为什么我不能在 write-host 中使用 $_ ?

我正在尝试将字符串数组通过管道传输到 write-host 并显式用于$_写入这些字符串:

'foo', 'bar', 'baz' | write-host $_
Run Code Online (Sandbox Code Playgroud)

但是,它失败了:

输入对象无法绑定到命令的任何参数,因为该命令不采用管道输入,或者输入及其属性与采用管道输入的任何参数都不匹配。

这个错误消息对我来说毫无意义,因为我完全能够写

'foo', 'bar', 'baz' | write-host
Run Code Online (Sandbox Code Playgroud)

我本以为两条管道是等效的。显然,他们不是。那么,有什么区别呢?

powershell pipeline automatic-variable

5
推荐指数
1
解决办法
2842
查看次数

变量上的++运算符未按ScriptBlock中的预期进行更改

我试图通过在文件中添加基于递增计数器的前缀来重命名文件,例如:

$directory = 'C:\Temp'
[int] $count=71; 

gci $directory | sort -Property LastWriteTime | `
rename-item -newname {"{0}_{1}" -f $count++, $_.Name} -whatif
Run Code Online (Sandbox Code Playgroud)

然而,所有的文件处理是71_$count$count++从不增量和文件名前缀相同?为什么?


在此处输入图片说明

powershell scope pipe scriptblock rename-item-cmdlet

3
推荐指数
1
解决办法
73
查看次数

在 Powershell 中使用分隔符分割文件

我目前有一个 Powershell 脚本,它正在迭代捆绑的 MT103 文件。目前,它检查标志并决定是否转发文件。问题是,有时,MT177(不需要的)信息与所需的文件捆绑在一起,并且文件被转发到放置点。

如何修改我的 Powershell 脚本以根据分隔符“{-”检测并分割此文件。

例如:多次付款由换行符分隔。例如:

{-
MT103 payment 1
-}
{-
MT103 payment 2
-}
Run Code Online (Sandbox Code Playgroud)

我们的愿望是将这个文件分割成多个文件,然后单独处理它们。

生成的文件应包含

{-
MT103 payment 1
-}
Run Code Online (Sandbox Code Playgroud)
{-
MT103 payment 2
-}
Run Code Online (Sandbox Code Playgroud)

powershell split text-parsing

3
推荐指数
1
解决办法
3225
查看次数

如何直接通过管道传输到 Copy-Item 而不是在 ForEach-Object 内

由于使用 -Recurse 标志时,Get-ChildItem 的 -Exclude 参数不会对子文件夹进行过滤,因此请参阅使用 get-childitem-exclude-parameter-in-powershell 中的其他无法排除目录的内容

但 -Exclude 参数可用于过滤掉根级别的文件夹

我写了自己的递归函数:

function Get-ChildItem-Recurse() {
    [cmdletbinding()]
    Param(
      [parameter(ValueFromPipelineByPropertyName = $true)]
      [alias('FullName')]
      [string[]] $Path,
      [string] $Filter,
      [string[]] $Exclude,
      [string[]] $Include,
      [switch] $Recurse = $true,
      [switch] $File = $false
    )

    Process {
      ForEach ( $P in $Path ) {
        Get-ChildItem -Path $P -Filter $Filter -Include $Include -Exclude $Exclude | ForEach-Object {
        if ( -not ( $File -and $_.PSIsContainer ) ) {
          $_
        }
        if ( $Recurse -and $_.PSIsContainer ) {
          $_ …
Run Code Online (Sandbox Code Playgroud)

powershell pipeline copy-item foreach-object

2
推荐指数
1
解决办法
915
查看次数

Powershell ForEach-Object 多次处理目录中的文件

我有一系列文件,它们都是从基本系统导出的(补救措施)。默认情况下,它们在文件名之前有 32 个字符的 ID 相关信息。我想把这些字符去掉。然而,这样做也会导致重复,所以我需要一种方法来重命名它们而不创建重复。

例子:

CWL000000004901-z2AF 工作日志01-RFP 2012 01 获奖推荐.pdf

CWL000000004716-z2AF 工作日志01-Computrace 2009 年 11 月.pdf

CWL000000006007-z2AF 工作日志01-Computrace 2009 年 11 月.pdf

(删除前面的字符后,后 2 个将相同)

$i = 1
Get-ChildItem -Path "C:\temp\Remedy Contract Attachments\Output\CTR_WorkLog_test1_a" | 
ForEach-Object -Process {
    $NewName = $_.BaseName.Substring(32)
    $NewName2 = $NewName + "_" + $i + $_.Extension
    Rename-Item $_.FullName -NewName $NewName2
    $i++
 }
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码。

似乎只要总字符数小于 64 就可以,

Computrace_Nov_2009_156.pdf

Computrace_Nov_2009_157.pdf

但随后它似乎会重复处理其余部分,就像这样

ietor_127_502.pdf

该文件夹中只有 394 个文件。

我从 PowerShell 学到的大部分内容都是从这里学到的,但我绝对被难住了。为什么它要多次处理文件?它会抛出一堆错误,表示它无法删除超过字符串中的字符数,因此显然它在最终崩溃之前仍在处理它们。但为什么?

或者有更好的方法来做到这一点吗?

我确信这是一件小事,我会因为整个下午都在与这些代码战斗而感到愚蠢。

谢谢!

powershell foreach-object

2
推荐指数
1
解决办法
103
查看次数

Powershell 参数绑定 ByPropertyName 和 ByValue

我想停止名为“ALG”的服务,所以我使用:"alg" | stop-service

有用。

Get-help stop-service -parameter name说:

Pipeline input:true(ByPropertyName, ByValue)而“alg”是“ByPropertyValue”,对吗?

我想停止名为记事本的进程,因此我使用:"notepad" | stop-process并且收到错误。

Get-help stop-process -parameter name

说:Pipeline input true(ByPropertyName)“记事本”是“ByPropertyName”?

为什么会出现这个错误?

parameters powershell

1
推荐指数
1
解决办法
1722
查看次数

将字符串插入多个文件名

我有多个以这种格式命名的文件:

Fat1920OVXPlacebo_S20_R1_001.fastq
Kidney1235SHAM_S65_R1_001.fastq
Kidney1911OVXPlacebo_S94_R2_001.fastq
Liver1289OVXEstrogen_S24_R2_001.fastq
Run Code Online (Sandbox Code Playgroud)

我需要在他们的名字中插入字符串“L1000_”,以便他们阅读

Fat1920OVXPlacebo_S20_L1000_R1_001.fastq
Kidney1235SHAM_S65_L1000_R1_001.fastq
Kidney1911OVXPlacebo_S94_L1000_R2_001.fastq
Liver1289OVXEstrogen_S24_L1000_R2_001.fastq
Run Code Online (Sandbox Code Playgroud)

我很抱歉,但我绝对没有在 powershell 中编码的经验。我能找到的最接近的方法是重命名整个文件的脚本:

Set objFso = CreateObject(“Scripting.FileSystemObject”)

Set Folder = objFSO.GetFolder(“ENTER\PATH\HERE”)

For Each File In Folder.Files

    sNewFile = File.Name

    sNewFile = Replace(sNewFile,”ORIGINAL”,”REPLACEMENT”)

    if (sNewFile<>File.Name) then

        File.Move(File.ParentFolder+”\”+sNewFile)

    end if

Next
Run Code Online (Sandbox Code Playgroud)

但是,我只需要在文件标题的特定位置插入一个字符串。我有 257 个文件,不想一个一个地进行。有没有人知道如何在 Windows 中运行它?

windows powershell

1
推荐指数
1
解决办法
58
查看次数

Powershell重命名日期时间格式的文件

我有一个文件夹,其中包含按时间戳命名的媒体文件,如下所示yyyyMMdd_HHmmss_*.*。我需要将它们重命名为yyyy-MM-dd HH-mm-ss *.*

例如,我需要将文件重命名20181019_210353_BURST2.jpg2018-10-19 21-03-53 BURST2.jpg 有一个我的丑陋方法

PS E:> gci | Rename-Item -NewName { $_.Name.Substring(0,4) + '-' + $_.Name.Substring(4,2) + '-' + $_.Name.Substring(6,2) + ' ' + $_.Name.Substring(9,2) + '-' + $_.Name.Substring(11,2) + '-' + $_.Name.Substring(13,2) + $_.Name.Substring(15) }
Run Code Online (Sandbox Code Playgroud)

实现我的目的的正确命令是什么?

powershell datetime rename-item-cmdlet

1
推荐指数
1
解决办法
396
查看次数